■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。 基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、最も簡単なA問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 007のA問題 https://atcoder.jp/contests/abc007/tasks/abc007_1
●問題文
小学生のたかはし君は、遠足で林にきています。遠足を楽しんでいる彼は、木が一直線に並んでいることに気づきました。 そして、授業で、「植木算」というものを習ったことを思い出しました。彼が授業で習った植木算の問題は、「木が 4 本 一直線に並んでいるとき、隣り合う木の"間"は何箇所存在するか。」というもので、その答えは下の通り 3 箇所です。
木 | 間 | 木 | 間 | 木 | 間 | 木
今回、遠足中の彼が見ている光景は、その問題のシチュエーションとよく似通っていて、隣り合う木の間の数を数えたくなりました。 彼は遠足パンフレットに、一直線に生えている木々の本数が書かれていることに気づきました。しかし、彼は実際に木の間を数える手段しか知らないので、本数によってはとても時間がかかってしまうかもしれません。
そこで、あなたにお願いがあります。 一直線に並んでいる木々が n 本あるという情報が与えられるので、隣り合う木の間の数を出力するプログラムをたかはし君のために作ってあげてください。
●入力
入力は以下の形式で標準入力から与えられる。
N
1 行目には、一直線に並んでいる木々の本数を表す整数 n(1≦n≦10,000) が与えられる。
●出力
隣り合う木の間の数を 1 行に出力せよ。出力の末尾に改行をいれること。
■回答
●愚直に書く
これはシンプルにこれでいいのかな…?
n = gets.to_i
p n - 1
通った!
●リファクタリング
変数を使わないというくらいか。
p gets.to_i - 1
●他の方の回答例
上位の方も大体同じでした。
●出てきたメソッド
公式リファレンスを見る訓練。
-
gets https://docs.ruby-lang.org/ja/latest/method/IO/i/gets.html
- EOF は end of fileの略
-
to_i https://docs.ruby-lang.org/ja/latest/method/String/i/to_i.html
- 「変換対象が空文字列であれば 0 を返します。」
- 「基数を指定することでデフォルトの 10 進以外に 2 〜 36 進数表現へ変換できます。」
-
参考:chomp https://docs.ruby-lang.org/ja/latest/method/String/i/chomp.html
■振り返りなど
- 問題自体はサクッと解けた
- るりまの読み方がよくわからん…。色々見て慣れるしかない