INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 012のB問題
https://atcoder.jp/contests/abc012/tasks/abc012_2
●問題文
高橋君は、お風呂で湯船に浸かった秒数を数える習慣があります。
今日は、高橋君は湯船で N 秒まで数えました。
しかし、秒だと解りにくいので、何時間何分何秒、という形に直したいです。
秒数 N が与えられるので、 hh:mm:ss の形式に変換しなさい。
●入力
入力は以下の形式で標準入力から与えられる。
N
1 行目には、高橋君が湯船に浸かった秒数を表す整数 N(0≦N≦86399) が与えられる。
●出力
高橋君が湯船に浸かっていた時間を、hh:mm:ss の形式で、 1 行で出力せよ。出力の末尾には改行をいれること。
■回答
●愚直に書く
- 時
h
と分m
と秒s
に分けて表示したい - 1時間は3600秒で 1分は60秒だから、まず3600で割って商だけ取り出したものが
h
で、余りを60で割って商だけ取り出したものがm
で、残った余りがs
という感じかな? - あと1桁の場合にゼロ埋めしないといけないからrjustメソッドも使うか。
n = gets.to_i h = (n / 3600).to_s.rjust(2, "0") m = ((n % 3600) / 60).to_s.rjust(2, "0") s = ((n % 3600) % 60).to_s.rjust(2, "0") puts h + ":" + m + ":" + s
通った!
リファクタリングしがいのある仕上がり…笑。
●リファクタリング/別アプローチ
.to_s.rjust(2, "0")
を3回繰り返しているので共通化したいが…。
あと、「間を:
で埋めて表示」ということは、時と分と秒を配列にしてjoinするということもできそう。
n = gets.to_i
h = n / 3600
m = (n % 3600) / 60
s = (n % 3600) % 60
ary = Array[h, m, s].map { |val| val.to_s.rjust(2, "0") }
puts ary.join(':')
通った!
コード長はそこまで変わってないけど、同じ記述を共通化できたのは良かった、のかな…?
●他の方の回答例
- 上位の方、何を書いているのかさっぱりわからない… 😇
- 僕の書いた
m
とs
って、後半部分は式を進めて簡単に書いておいた方が良いのかな。 - Timeクラスの
strftime
メソッドというのを使うのが最もスマートな気がする…。これは、こういうメソッドがあるだろうと疑いたかった。
●出てきたメソッド等
公式リファレンスを見る訓練。
-
rjust
https://docs.ruby-lang.org/ja/latest/method/String/i/rjust.html -
join
https://docs.ruby-lang.org/ja/latest/method/Array/i/join.html -
strftime
https://docs.ruby-lang.org/ja/latest/method/Time/i/strftime.html
■振り返りなど
B問題になると程よく難しくて、時間もかかってしまうけど、楽しい。