第95回【JavaScript】文字列

現在取り組んでいるのは、paiza ラーニング問題集「Cランクレベルアップメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

JavaScript をゼロから勉強してみよう、のコーナー 95 回目です。

スタートは、JavaScript を利用してフロントを作ろう、だったのですが、なかなか思うように進んでいない状況です。別でやっている AWS を利用した Minecraft サーバーの構築も、将来的には状況確認をブラウザで出来ればなぁ、と。そのためにはもっと JavaScript を勉強する必要がありそうです。

それでは、今日も頑張ってみようと思います。

文字列 (paizaランク C 相当)

パイザ君の家の前では毎週日曜日に工事が行われます。この先 N 週間、工事が日曜日の何時に始まり、どれくらいの時間続くのかは分かっています。パイザ君は工事の間は家を離れようと思っているので、それぞれの日に工事が何時に終わるのかを知りたいと思いました。

工事が N 週間続くとして、各週日曜日の工事が始まる時刻と、工事が何時間何分続くのかに関する情報が与えられるので、工事が終わる時刻を 00:00 から 23:59 までの 24 時間表記で出力してください(ここで「工事が終わる時刻」とは、工事が h 時間 m 分続くとした場合、工事が始まった時刻の h 時間 m 分後を指します)。


入力される値

N
t_1 h_1 m_1
...
t_N h_N m_N

1 行目には工事が続く週の数を表す正整数 N が与えられ、 2 行目から (N + 1) 行目には工事が始まる時刻と、工事がどれくらい続くのかについての情報が、 “t_i h_i m_i" という形式で与えられます(1 ≤ i ≤ N)。これは時刻 t_i に工事が始まり、 h_i 時間 m_i 分工事が続くことを意味しています。t_i, h_i, m_i は各行において半角スペース区切りで与えられます。

t_i は 24 時間表記で時刻を表す文字列で、 “AB:XY" という形をしており、これは AB 時 XY 分を表します。ただし、今回は 00:00 から 23:59 までの 24 時間表記を採用し、時・分を表す数字が 1 桁の場合には十の位を 0 で埋めます。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

入力された通りの順番で、各週の工事が終わる時刻を N 行出力してください。時刻の表記は入力と同じフォーマットに従うものとし、 24 時以降は翌日の時刻を記し、 00:00 から 23:59 までの間に収まるように、また、時や分を表す数字が1桁の場合には十の位を 0 で埋めてください。たとえば 24 時は 00:00、 27 時は 03:00 となります。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≤ N ≤ 50
・ 0 ≤ h_i ≤ 23
・ 0 ≤ m_i ≤ 59


入力例

2
15:59 0 1
23:20 1 0

出力例

16:00
00:20

Python のときの模範解答に準じて書いてみる。なかなか大変そうだ。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const N = Number(lines[0]);
  for (let i = 1; i <= N; i++) {
      let [t,h,m] = lines[i].split(/\s/);
      let [th,tm] = t.split(':').map(Number);
      
      let ah = th + Number(h);
      let am = tm + Number(m);
      
      if (am >= 60) {
          ah += 1;
          am -= 60;
      }
      if (ah >= 24) {
          ah -= 24;
      }
      console.log(('00' + ah).slice(-2) + ':' + ('00' + am).slice(-2));
  }
});
Python
N = int(input())
for i in range(N):
    t, h, m = input().split()
    th = int(t[:2])
    tm = int(t[3:])
    h = int(h)
    m = int(m)

    ah = th + h
    am = tm + m

    if am >= 60:
        ah += 1
        am -= 60
    if ah >= 24:
        ah -= 24

    ah = str(ah)
    am = str(am)

    if len(ah) == 1:
        ah = "0" + ah
    if len(am) == 1:
        am = "0" + am
    print(ah + ":" + am)

最後に

ポイントは先に「分」の方が 60 を超えているかどうかを判定するところ。それにより「時」が繰り上がり、24 を超えてしまう可能性もあるので。

文字列や数値が混在していて、型を意識しないといけないパターンは、むしろ、LeoSaki(旦那)は得意だと思う。しかし、躓きポイントにもなり得るので、しっかり学習したいと思います。

引き続き、よろしくお願いいたします!

Python の第95回はこちら