INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 053のA問題
https://atcoder.jp/contests/abc053/tasks/abc053_a
●問題文
すめけくんは現在のレートが 1200 未満ならば AtCoder Beginner Contest (ABC) に、そうでなければ AtCoder Regular Contest (ARC) に参加することにしました。 すめけくんの現在のレート x が与えられます。すめけくんが参加するコンテストが ABC ならば ABC と、そうでなければ ARC と出力してください。
●制約
- 1≦x≦3,000
- x は整数
●入力
入力は以下の形式で標準入力から与えられる。
x
●出力
答えを出力せよ。
■回答
●愚直に書く
1200未満の場合とそうでない場合で条件分岐させる。
x = gets.to_i
if x < 1200
puts "ABC"
else
puts "ARC"
end
通った!
三項演算子にして、
x = gets.to_i
puts x < 1200 ? "ABC" : "ARC"
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
メインメソッド、ABCかどうかの判定メソッド、標準入力を取得するメソッドを作成。
def main
x = read_num
puts is_ABC?(x)
end
def is_ABC?(x)
if x < 1200
"ABC"
else
"ARC"
end
end
def read_num
gets.to_i
end
main
通った!
●リファクタリング/別アプローチ
三項演算子はもうやったし、他に思いつかないので割愛。
●他の方の回答例
面白かった回答が2つ。
<1つ目>
puts gets<"1200"?:ABC: :ARC
標準入力側をto_i
するのではなくて1200の方をstring
にしている。これでも比較できるんだ…?
<2つ目>
puts "A#{'RRB'[gets.to_i<=>1200]}C"
<=>
見たことある!飛行船演算子だっけ、と思ったら宇宙船演算子だった笑。
これは何をしてるかというと、ABC
とARC
のどちらでもA
とC
は確定しているので、出し分けが必要なのはB
とR
だけ。それを判定するために宇宙船演算子で返される-1
と0
と1
をうまく活用して
'RRB'[-1]
→B'RRB'[0]
→R'RRB'[1]
→R
となるようにしている。なるほど…!!!
●出てきたメソッド等
公式リファレンスを見る訓練。
- Array#<=>
https://docs.ruby-lang.org/ja/latest/method/Array/i/=3c=3d=3e.html - Ruby の <=> 演算子が返す値を覚える方法
https://qiita.com/takuya0301/items/364f2b3f7ba2c36e0f62
■振り返りなど
宇宙船演算子。いつかサラッと使ってみたい。