■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。 基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 082のA問題 https://atcoder.jp/contests/abc082/tasks/abc082_a
●問題文
2 つの正整数 a, b が与えられます。 a, b の平均値を x とします。 x の小数点以下を切り上げて得られる整数を出力してください。
●制約
- a, b は整数である。
- 1≤a,b≤100
●入力
入力は以下の形式で標準入力から与えられる。
a b
●出力
x の小数点以下を切り上げて得られる整数を出力せよ。
■回答
●愚直に書く
切り上げってのが厄介。 余りを切り上げるメソッドとかあるのかな、それを調べる前にまずは愚直に「aとbを足して奇数だったら1足して、それから2で割る」で答えは出そう。
a, b = gets.split.map(&:to_i)
sum = a + b
puts sum % 2 == 1 ? (sum + 1) / 2 : sum / 2
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
メインメソッド、計算するメソッド、標準入力を取得するメソッドの3つを作成。
def main
a, b = read_nums
puts get_average(a, b)
end
def get_average(a, b)
sum = a + b
sum % 2 == 1 ? (sum + 1) / 2 : sum / 2
end
def read_nums
gets.split.map(&:to_i)
end
main
通った!
●リファクタリング/別アプローチ
そもそも余りを切り上げるようなメソッドがあれば一発なので調べる。
ceil
メソッドが浮動小数点数を切り上げるらしい、ふむ。
そうすると標準入力で取得した整数を一旦浮動小数に変換してからceilして、最後にまた整数に戻すってこと?それはそれで冗長な気もする…。
あ、違う、ceilすれば浮動小数点数を切り上げた形の整数にしてくれるんだ。
a, b = gets.split.map(&:to_i)
sum = a + b
puts (sum.to_f / 2).ceil
通った!
●他の方の回答例
a, b = gets.split.map(&:to_i)
puts (a+b+1)/2
あ、そうか。。。。整数の割り算は小数点切り捨てられるから、「奇数なら1足して」見たいな場合分けは不要で、単純にsumに1を足して2で割れば求める結果になるじゃん…。ショック!
●出てきたメソッド等
公式リファレンスを見る訓練。
自身と等しいかより大きな整数のうち最小のものを返します。
この日本語がむずくて5分くらい考えてた汗。
1.2
の場合、これ自身が少数だから「自身と等しい整数」はなくて、より大きな整数の最小のものってのが2
、すなわち繰り上げてるってことね。
■振り返りなど
回り道していてショックだったけど、まぁceil
とかを調べられたのでOK。