※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。
詳しくはコチラ
なるべくわかりやすい解説を付けました。
問題1 数字の文字列操作(時刻2)
時刻を表す長さ 5 の文字列 S が “XX:XX” の形式で与えられます。与えられた時刻の 30 分後の時刻を同じ形式で出力してください。
1 行目に文字列 S が与えられます。
S は “XX:XX” という形をしており、 “:” の左側は時を、右側は分を表します。時や分が一桁である場合、十の位は 0 で埋められます。また、 00:00 から 23:59 までの 24 時間表記を採用しています。
-
入力例1 01:02
-
出力例1 01:32
-
入力例2 12:31
-
出力例2 13:01
解答 入力例1で解説
- 入力された時刻を受け取る(数値としてこのとき:は消える)
- hは1が入っている
- mには2が入っている
- mに30を加算する
- 条件分岐でmが60以上のとき、mに−60して、hを1増やす
- hとmを文字列に変換する
- hとmが一桁の時に”01″となるように’0’を追加する
- hとmの間に:をつけて出力する
s = gets.split(':').map(&:to_i) h = s[0] m = s[1] m += 30 if m > 59 m -= 60 h += 1 end h = h.to_s m = m.to_s h = '0' + h if h.size == 1 m = '0' + m if m.size == 1 puts h + ':' + m
問題 文字列(工事)
工事がN週間続く
各週日曜日の工事が始まる時刻と、
工事が何時間何分続くのかに関する情報が与えられるので、
工事が終わる時刻を00:00から23:59までの24時間表記で出力してください
工事がh時入力は以下のフォーマットで与えられます。
入力される値 N(工事が続く週の数を表す整数) t_1 工事が始まる時間 h_1 工事が続く時間 m_1 工事が続く分 半角スペース区切りで与えられます。
t_iは24時間表記の時刻を表す文字列で、”AB:XY”という形をしており、これはAB時XY分を表す。
今回は00:00〜23:59までの24時間表記を採用し、時・分を表す数字が1桁の場合には十の位を0で埋めます。
入力値最終行の末尾に改行が1つ入ります。
t_N h_N m_N間m分続くとした場合、工事が始まった時刻のh時間m分後を指します)。
各週の工事が終わる時刻をN行出力してください。
時や分を表す数字が1桁の場合には十の位を0で埋めてください。たとえば24時は00:00、27時は03:00となります。
-
入力例2 2 15:59 0 1 23:20 1 0 出力例2 16:00 00:20
解答
- 入力Nを受け取る
- N回繰り返したいのでn.times
- 変数t, a_h, a_mにそれぞれ文字列を代入していく
- 変数h, mに時刻の部分の:で分割して数値を代入する。
- a_hとa_mを数値に変換して自己代入する
- mにa_m, hにa_hを加算する
- 条件分岐でmが60以上のとき、mに−60して、hを1増やす
- hが24以上のときhを−24する
- hとmを文字列に変換する
- hとmが一桁の時に”01″となるように’0’を追加する
- hとmの間に:をつけて出力する
n = gets.to_i
n.times do
t, a_h, a_m = gets.split(' ')
h, m = t.split(':').map(&:to_i)
a_h = a_h.to_i
a_m = a_m.to_i
m += a_m
h += a_h
if m > 59
m -= 60
h += 1
end
h -= 24 if h > 23
m = m.to_s
h = h.to_s
m = '0' + m if m.size == 1
h = '0' + h if h.size == 1
puts h + ':' + m
end
※ポイント
a, b, c = 長さ3の配列
のように書くと a, b, c に 長さ3の配列
の要素が先頭から順に代入される
たとえばa, b, c= [1, 2, 3]
と書くと a に 1 が、b に 2 が、c に 3 がそれぞれ代入される。
配列の長さと同じ数の変数を左辺に用意する必要があります。
日付を跨ぐ場合、h > 23
のときh -= 24
を実行する
h の長さが 1 であるとき、h の先頭に 0 を付ける
m の長さが 1 であるとき、m の先頭に 0 を付ける
先に分の方の計算を先にすること!
m > 59
の操作で h > 23
になる可能性があるため。