■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。 基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、最も簡単なA問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 008のA問題 https://atcoder.jp/contests/abc008/tasks/abc008_1
●問題文
高橋君は子供の頃の写真を整理している。
整理している最中に、写真を入れている木箱が出てきたので、木箱内にある写真をアルバムに貼って整理することにした。どの位の大きさのアルバムが必要なのか確認するために、木箱の中にある写真の枚数が知りたくなった。
高橋君はすべての写真に正整数の通し番号を付けており、木箱内には通し番号が S 以上 T 以下であるすべての写真が入っている。
高橋君は、木箱にある写真の枚数が知りたいが、写真を 1 枚ずつ数えるのは大変である。
あなたは高橋くんの代わりに、S と T の値からアルバムに貼られている写真の枚数を計算するプログラムを作成せよ。
●入力
入力は以下の形式で標準入力から与えられる。
S T
1 行目には、アルバムに貼られている写真の範囲を表す 2 つの整数 S,T(1≦S≦T≦1,000) が与えられる。
●出力
木箱内にある写真の枚数を出力せよ。出力の末尾にも改行を入れること。
■回答
●愚直に書く
TからSを引いて1を足せば求める数字になるかな?
s, t = gets.split.map(&:to_i)
p t - s + 1
通った!
●リファクタリング/別アプローチ
上記のままでも良さそうだけど、範囲オブジェクトとか使えないかな…。
s, t = gets.split.map(&:to_i)
p (s..t).size
通った! コード長も実行時間も初めに書いたほうが結果としては良かったけど、コードを見て意味を掴みやすいのはこっちな気がする。
●他の方の回答例
上位の方々が書いてるコードの意味がわからない笑。 少し下にいくと僕が初めに書いたコードに似たような回答も多かった。範囲オブジェクトは上位では出てこない。
●出てきたメソッド
公式リファレンスを見る訓練。
-
split https://docs.ruby-lang.org/ja/latest/method/String/i/split.html
-
size https://docs.ruby-lang.org/ja/latest/method/Range/i/size.html
-
eval (上位回答によく出てきた) https://docs.ruby-lang.org/ja/latest/method/Kernel/m/eval.html
- よくわからなくて結局公式リファレンスじゃないページも見た汗。
https://techacademy.jp/magazine/18717
引数で渡した文字列をRubyのプログラムとして実行するメソッド
わかったようなわからんような…。ひとまずはこういうものがあるということだけ把握しておく。
- よくわからなくて結局公式リファレンスじゃないページも見た汗。
https://techacademy.jp/magazine/18717
■振り返りなど
リファクタリング前の方が結果の数値としては良かったけど、別アプローチの書き方を思いつけたのは良かった。こういう練習をしたいのだ。