INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 035のA問題
https://atcoder.jp/contests/abc035/tasks/abc035_a
●問題文
高橋君は画面の幅が W 、高さが H のテレビを持っています。
このテレビの画面アスペクト比 W:H が 4:3 か 16:9 か判定してください。
●入力
入力は以下の形式で標準入力から与えられる。
W H
- 1 行目にテレビの画面の幅と高さを表す 2 つの整数 W,H(1 ≦ H < W ≦ 10^5 ) が空白区切りで与えられる。
- テレビの画面アスペクト比は 4:3 か 16:9 になることが保証される。
●出力
高橋君のテレビの画面アスペクト比 W:H が 4:3 ならば4:3を、 16:9 ならば 16:9 を 1 行に出力せよ。改行を忘れないこと。
■回答
●愚直に書く
「テレビの画面アスペクト比は 4:3 か 16:9 になることが保証される」ので、W/Hが4/3になれば4:3 、という感じでいけるのかな。
w, h = gets.split.map(&:to_r)
if (w / h) == (4 / 3)
puts '4:3'
else
puts '16:9'
end
これだと通らない。4 / 3
が1
になってしまうので、4.to_r / 3.to_r
にしないといけなくて冗長になってくる…。
4 / 3
がややこしいので3 / 4
で0.75
を使う方がシンプルになりそう。
w, h = gets.split.map(&:to_f)
if (h / w) == 0.75
puts '4:3'
else
puts '16:9'
end
通った!
三項演算子にして
w, h = gets.split.map(&:to_f)
puts (h / w) == 0.75 ? '4:3' : '16:9'
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
def main
w, h = read_nums
puts judge_ratio(h, w)
end
def judge_ratio(h, w)
(h / w) == 0.75 ? '4:3' : '16:9'
end
def read_nums
gets.split.map(&:to_f)
end
main
通った!!
●リファクタリング/別アプローチ
特に思いつかず…!
●他の方の回答例
h*4==w*3 ? '4:3' : '16:9'
と書いている方がいてなるほどと思った。
●出てきたメソッド等
公式リファレンスを見る訓練。
■振り返りなど
割り算が絡むとto_f
やto_r
など結構気を使う必要がある。