コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 030 A – 勝率計算

■はじめに

Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)

(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。

■問題

●出典

AtCoder Beginner Contest 030のA問題
https://atcoder.jp/contests/abc030/tasks/abc030_a

●問題文

野球のAtCoderリーグのシーズンが終了しました。チーム高橋は A 試合中 B 回勝ち、チーム青木は C 試合中 D 回勝ちました。AtCoderリーグでは勝率の高い順に高い順位が与えられます。チーム高橋とチーム青木のどちらが勝率で勝っているか答えるプログラムを作成してください。

●入力

入力は以下の形式で標準入力から与えられる。

A B C D
  • 1 行目には、4 つの整数 A,B,C,D(1≦A,B,C,D≦100) が与えられる。
  • B≦A かつ D≦C を満たすことが保証される。

●出力

チーム高橋の勝率がより高いときは TAKAHASHI、チーム青木の勝率がより高いときは AOKI、両チームの勝率が等しいときは DRAW と 1 行に出力せよ。出力の末尾にも改行をいれること。

■回答

●愚直に書く

ちょっと日を開けると標準入力の取り方を忘れそうになる。。。まず下記で標準入力を取る。

a, b, c, d = gets.split.map(&:to_f)

3分岐なので三項演算子は使わずに書いていくか…

a, b, c, d = gets.split.map(&:to_f)
if (b / a) > (d / c)
  puts 'TAKAHASHI'
elsif (b / a) == (d / c)
  puts 'DRAW'
else
  puts 'AOKI'
end

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。

def main
  scores = read_scores
  if score_of_takahashi(scores) > score_of_aoki(scores)
    puts 'TAKAHASHI'
  elsif score_of_takahashi(scores) < score_of_aoki(scores)
    puts 'AOKI'
  else
    puts 'DRAW'
  end
end

def score_of_takahashi(scores)
  scores[1] / scores[0]
end

def score_of_aoki(scores)
  scores[3] / scores[2]
end

def read_scores
  gets.split.map(&:to_f)
end

main

通った!!!
全体像はパッと思い浮かんだけど、標準入力を渡して高橋さんと青木さんのスコアを出すメソッドのところはscores[*]を多様しないでa b c dを使ってもうちょっとスマートに書けるのでは…。でもわからないのでここまで…。

●他の方の回答例

三項演算子のネストを使ってる人がかなり多い。

●出てきたメソッド等

公式リファレンスを見る訓練。

■振り返りなど

  • メソッド化はまだ修行が足りない。
  • 宇宙船演算子を知ることができて良かった。