コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 028 A – テスト評価

  • by

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 028のA問題
https://atcoder.jp/contests/abc028/tasks/abc028_a

●問題文

テストの点数を入れるとその評価を出力してくれるプログラムを作成してください。
プログラムの仕様は以下の通りです。

  • テストの点数として 0 以上 100 以下の整数を受け取る。
  • テストの点数が 59 点以下ならば Bad と出力。
  • 60 点以上 89 点以下ならば Good と出力。
  • 90 点以上 99 点以下ならば Great と出力。
  • 100 点ならば Perfect と出力。

●入力

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

N
  • 1 行に整数 N(0≦N≦100) が与えられる。これはプログラムに入力するテストの点数を表す。

●出力

テストの点数の評価を出力せよ。出力は標準出力に行い、末尾に改行を入れること。

■回答

●愚直に書く

標準入力を変数に入れてifで条件分岐。

n = gets.to_i
if n <= 59
  puts 'Bad'
elsif n >= 60 && n <= 89
  puts 'Good'
elsif n >= 90 && n <= 99
  puts 'Great'
else
  puts 'Perfect'
end

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。
標準入力の読み込みを別メソッドにしてmainメソッドの冒頭で変数に入れて処理を進める書き方。

def main
  n = read_score
  if n <= 59
    puts 'Bad'
  elsif n >= 60 && n <= 89
    puts 'Good'
  elsif n >= 90 && n <= 99
    puts 'Great'
  else
    puts 'Perfect'
  end
end

def read_score
  gets.to_i
end

main

通った!

ちなみに、もしn = read_scoreをしないでread_scoreを毎回ifの中に入れてしまうと、read_scoreがその都度呼び出されてしまって回答が誤りになる。
※「無駄に呼び出されるので、意図した結果が出力されるとしても読込の重複があって望ましくない」のかなと思っていたけど、標準入力の場合は複数回呼ばれると呼び出される数値そのものが、ここでは標準入力の行が1つずつズレていくので、完全に誤ったコードになってしまう。勉強になった。

●他の方の回答例

上位の方々の回答は凄すぎて全然わからない笑。
ちょっと下の方を見ると、三項演算子をネストしてコード長を短くしているのとかあって面白かった。

●出てきたメソッド等

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

  • 特に無し

■振り返りなど

これからしばらくの方針としてはメソッドを作る練習をしたいので、上位の書き方はあまり見ないようにしようかな…。
とはいえメソッド化した書き方におかしな部分がないかとかはちょっと心配でもある。