■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。 基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 016のB問題 https://atcoder.jp/contests/abc016/tasks/abc016_2
●問題文
高橋くんはプログラミングコンテストで A+B
を出力するプログラムを書いたつもりでしたが、 A-B
を出力するプログラムを書いたような気がしてきて不安になりました。高橋くんは書いたプログラムをうっかり消してしまって入出力しか残っていません。高橋くんが書いたプログラムが A+B
なのか、 A-B
なのか、どちらの可能性もあるか、どちらでもないかを判定してください。
ただし、 A+B
と A-B
のどちらかの可能性しかない場合、そのプログラムを書いたと判定します。例えば 1 1
という入力に対して 2
を出力しているなら、 A+B
の可能性はあるが A-B
の可能性はないので、高橋くんは A+B
を書いたと判定してください。
●入力
入力は以下の形式で標準入力から与えられる。
A B C
- 高橋くんのプログラムに対する入力を表す整数 A,B(0≦A,B≦100) と 高橋くんのプログラムの出力を表す整数 C(0≦C≦100) がスペース区切りで与えられる。
●出力
高橋くんが書いたプログラムが A+B
だとわかるなら +
、 A-B
だとわかるなら -
、どちらの可能性もあるなら ?
、 どちらでもないなら !
を出力せよ。出力の末尾には改行をつけること。
■回答
●愚直に書く
愚直に考えればifで条件を並べていけば良いかな…?
a, b, c = gets.split.map(&:to_i)
if (a+b==c) && (a-b==c)
puts '?'
elsif (a+b==c)
puts '+'
elsif (a-b==c)
puts '-'
else
puts '!'
end
通った!
●リファクタリング/別アプローチ
あまり思いつかないな、、、caseでもできそうだけど、条件がむしろややこしくなりそうな気がする。
●他の方の回答例
上位の方々の回答はやっぱり難しくてよくわからない…涙。 この回答が面白かった。
a,b,c=gets.split.map(&:to_i)
if a+b==c
puts a-b==c ? '?' : '+'
else
puts a-b==c ? '-' : '!'
end
if式をネストしてうまく条件に当てはめている、なるほど〜。
この回答も面白い!なるほどな〜。
a, b, c = gets.split.map(&:to_i)
ans = 0
ans += 1 if a + b == c
ans += 2 if a - b == c
puts "!+-?"[ans]
●出てきたメソッド等
公式リファレンスを見る訓練。
- 特になし
■振り返りなど
他の回答がとても参考になった。