コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 035 A – テレビ

  • by

■はじめに

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 / 31になってしまうので、4.to_r / 3.to_rにしないといけなくて冗長になってくる…。

4 / 3がややこしいので3 / 40.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_fto_rなど結構気を使う必要がある。