日別アーカイブ: 2022年3月5日

PaizaCランクLvアップ問題集(Ruby)

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

問題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で解説

  1. 入力された時刻を受け取る(数値としてこのとき:は消える)
  2. hは1が入っている
  3. mには2が入っている
  4. mに30を加算する
  5. 条件分岐でmが60以上のとき、mに−60して、hを1増やす
  6. hとmを文字列に変換する
  7. hとmが一桁の時に”01″となるように’0’を追加する
  8. 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

解答

  1. 入力Nを受け取る
  2. N回繰り返したいのでn.times
  3. 変数t, a_h, a_mにそれぞれ文字列を代入していく
  4. 変数h, mに時刻の部分の:で分割して数値を代入する。
  5. a_hとa_mを数値に変換して自己代入する
  6. mにa_m, hにa_hを加算する
  7. 条件分岐でmが60以上のとき、mに−60して、hを1増やす
  8. hが24以上のときhを−24する
  9. hとmを文字列に変換する
  10. hとmが一桁の時に”01″となるように’0’を追加する
  11. 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 になる可能性があるため。