■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。 基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、最も簡単なA問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 002のA問題 https://atcoder.jp/contests/abc002/tasks/abc002_1
●問題文
いま、神の恵みで高橋くんにお金が与えられます。 神は高橋くんに 2 つの金額を提示します。 正直者の高橋くんは、常に大きな金額を選択します。 そこで、与えられた 2 つの整数のうち、大きい方の値を出力するプログラムを書いてください。 (問題文が面白い。。。)
●入力
入力は以下の形式で標準入力から与えられる。
X Y
1 行目には、金額の大きさを示す整数 X , Y が与えられる。 2 つの整数 X , Y は 0≦X,Y≦10^9(10の9乗) を満たし、互いに異なることが保証されている。
●出力
X と Y のうち、大きい方の値を 1 行で出力してください。 また、出力の末尾には改行を入れること。
■回答
●愚直に書く
x, y = gets.split.map(&:to_i)
if x > y
puts x
else
puts y
end
これで通った!
ちなみにこれだとx
とy
が等しい時もY
と表示されちゃう式なのだけど、互いに異なることが保証されている
と問題に書かれているので問題なさそう。
●リファクタリング
このifは三項演算子にできる気がする。
# 三項演算子を使わない書き方
if 条件式
式1
else
式2
end
# 三項演算子を使った書き方
条件式 ? 式1 : 式2
ということでこんな感じにした
x, y = gets.split.map(&:to_i)
x > y ? puts x : puts y
テストしたらエラーが…。
./Main.rb:2: syntax error, unexpected local variable or method, expecting `do' or '{' or '('
# google翻訳
構文エラー、予期しないローカル変数またはメソッド、 `do'または'{'または'( '
むむむ…?式の区切りを明確にしろって感じなのかな、以下のように修正。
x, y = gets.split.map(&:to_i)
x > y ? (puts x) : (puts y)
これでうまくいった!
さらに、puts
はどっちの場合も実行するので三項演算子の外側においておいた方が重複がない。
x, y = gets.split.map(&:to_i)
puts x > y ? x : y
見た目的にも綺麗。
●他の方の回答例
これまでの回答例を全て見ることができるので、コード長が短い順などで絞り込んで、別の書き方を学ぶ。
p gets.split.map(&:to_i).max
あ〜、max
というドンピシャのメソッドがあるじゃないか…。max
自体を知らなくても「配列の中で一番大きいものを返すメソッドがあるのでは」と考えるべきだった。rubyでは(ruby以外知らないけど)、パッと思いつくような処理は大抵メソッドがあるので、まずそれを考えるべき。
■振り返りなど
- 正直に言うと
.map(&:to_i)
のところをちゃんとわかってなくて定型文として認識している。- 参考記事などでちゃんと理解しておきたい→「Rubyのmap &:to_iとはなんなのか」
- 三項演算子にした場合に式の区切りを明確化するためのカッコが必要になる場合があるので注意。
max
メソッドを使えなかったのが反省。