コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 057 A – Remaining Time

  • by

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 057のA問題
https://atcoder.jp/contests/abc057/tasks/abc057_a

●問題文

イルカはプログラミングコンテスト好きで、今日はAtCoderのコンテストに参加します。
現在時刻は、24 時間表記 (0:00〜23:59) で A 時ちょうどであり、コンテストがちょうど B 時間後に始まります。
コンテストの開始時刻は、24 時間表記で何時ちょうどでしょうか?

●制約

  • 0≦A,B≦23
  • A,B は整数である。

●入力

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

A B

●出力

コンテストの開始時刻を 24 時間表記で出力せよ。

■回答

●愚直に書く

AとBを足して、24以上だったら24を引けば良いか。それか24で割ってあまりを出せば良いか。
まず前者。

a, b = gets.split.map(&:to_i)
if (a + b) >= 24
  puts a + b - 24
else
  puts a + b
end

通った!三項演算子にして、

a, b = gets.split.map(&:to_i)
puts (a + b) >= 24 ? (a + b - 24) : (a + b)

通った!

後者。商の余りを使う。こっちのがスマートな気がする。

a, b = gets.split.map(&:to_i)
p (a + b) % 24

通った!!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。
今回はメインメソッドと標準入力を取ってくるメソッドの2つだけかな?

def main
  a, b = read_nums
  puts (a + b) % 24
end

def read_nums
  gets.split.map(&:to_i)
end

main

通った!

●リファクタリング/別アプローチ

商の余りを使うというのを上でやったので、割愛。

●他の方の回答例

上位の方々の書き方は難しいものが多い…が、基本的には商の余りという考え方。

1つ面白い書き方があったのでメモ。
aとbそれぞれで標準入力を取ってきて足すのでなく、1つの変数に配列で入れてsumしていた。
自分の解答に取り入れるとするとこうなる↓

n = gets.split.map(&:to_i)
puts n.sum % 24

とてもスマート!

●出てきたメソッド等

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

■振り返りなど

条件分岐から商の余りの解法にすぐ気づいてよかった。
sumの活用も勉強になった。