ガジェット通信

見たことのないものを見に行こう

【選択式問題】日付&時刻パズル2【言語不問】解答と解説

DATE:
  • ガジェット通信を≫

日付&時刻パズル2

本問題は、仮想コードのルールに従った処理の結果を、選択肢から選ぶというものでした。

それでは以下、各問題とその解答を見ていきましょう。

問題のオープニング

あなたは、日付&時刻の女神「デー=ト」の神殿にやって来ました。

この神殿では、女神の出す問題に正解すれば富を約束され、間違うと死を約束されます。

あなたは、歴戦のプログラマーとして、女神の意図をくんで解答しなければなりません。

この神殿では、仮想コードが提示されます。その計算結果を、選択肢から選びます。

// 仮想コードのルール
YYYY-MM-DDThh:mm:ss …… YYYYが年、MMが月、DDが日、hhが時、mmが分、ssが秒の日時。
その他の数字 …… 秒。
* / + – …… 四則演算の演算子。乗除が加減に優先。
() …… 丸括弧の中の計算を優先的に行う。

問題1

// 問題
2016-01-01T01:00:00 – 1

// 選択肢
2016-01-01T00:99:99
2016-01-01T00:59:59
2015-12-31T23:59:59

それでは問題の答えが、どのような値になるか、見ていきましょう。

// 仮想コードの処理

2016-01-01T01:00:00 から 1秒 を引く

2016-01-01T01:00:00 は 2016-01-01 と 01:00:00 に分けられる

01:00:00 から 1秒 を引くと 00:59:59

なので 2016-01-01T00:59:59

上記の通り、答えは2番目の選択肢の『2016-01-01T00:59:59』になります。

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード

// 関数
function calc(s) {
s = s.replace(/d{4}-dd-ddTdd:dd:dd/g, function(s) {
return +new Date(s) / 1000 | 0;
});
try {s = eval(s);} catch(e) {console.log(e)}
var d = new Date(s * 1000);
s = d.getUTCFullYear() + “-”
+ (“0” + (d.getUTCMonth() + 1)).substr(-2) + “-”
+ (“0” + d.getUTCDate()).substr(-2) + “T”
+ (“0” + d.getUTCHours()).substr(-2) + “:”
+ (“0” + d.getUTCMinutes()).substr(-2) + “:”
+ (“0” + d.getUTCSeconds()).substr(-2);
return s;
};

// 問題
console.log(calc(“2016-01-01T01:00:00 – 1”));

// 出力結果
2016-01-01T00:59:59

問題2

// 問題
2016-01-01T01:00:00 + 60 * 60 * 60

// 選択肢
2016-01-01T02:00:00
2016-01-02T01:00:00
2016-01-03T13:00:00

それでは問題の答えが、どのような値になるか、見ていきましょう。

// 仮想コードの処理

60 * 60 * 60
→「60秒 * 60 * 60」
→「1分 * 60 * 60」
→「60分 * 60」
→「1時間 * 60」
→ 60時間

60時間 は 2日(48時間)と 12時間

2016-01-01T01:00:00 に 2日と 12時間 を足す

2016-01-03T13:00:00

上記の通り、答えは3番目の選択肢の『2016-01-03T13:00:00』になります。

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード

// 関数
function calc(s) {
s = s.replace(/d{4}-dd-ddTdd:dd:dd/g, function(s) {
return +new Date(s) / 1000 | 0;
});
try {s = eval(s);} catch(e) {console.log(e)}
var d = new Date(s * 1000);
s = d.getUTCFullYear() + “-”
+ (“0” + (d.getUTCMonth() + 1)).substr(-2) + “-”
+ (“0” + d.getUTCDate()).substr(-2) + “T”
+ (“0” + d.getUTCHours()).substr(-2) + “:”
+ (“0” + d.getUTCMinutes()).substr(-2) + “:”
+ (“0” + d.getUTCSeconds()).substr(-2);
return s;
};

// 問題
console.log(calc(“2016-01-01T01:00:00 + 60 * 60 * 60”));

// 出力結果
2016-01-03T13:00:00

問題3

// 問題
2016-01-01T01:00:00 + 2016-02-28T00:00:00 – 2016-02-02T00:00:00

// 選択肢
2016-02-22T00:00:00
2016-02-01T01:00:00
2016-01-27T01:00:00

それでは問題の答えが、どのような値になるか、見ていきましょう。

// 仮想コードの処理

後ろ側の 2016-02-28T00:00:00 – 2016-02-02T00:00:00 は

2016-02 と 00:00:00 の部分が同じ

違うのは 28日 と 2日 の部分

なので、28日 から 2日 を引くだけでよい

そのため、後ろ側の 2016-02-28T00:00:00 – 2016-02-02T00:00:00 を先に計算する

28日 から 2日 を引くと 26日

2016-01-01T01:00:00 に 26日 を足す

2016-01-27T01:00:00

上記の通り、答えは3番目の選択肢の『2016-01-27T01:00:00』になります。

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード

// 関数
function calc(s) {
s = s.replace(/d{4}-dd-ddTdd:dd:dd/g, function(s) {
return +new Date(s) / 1000 | 0;
});
try {s = eval(s);} catch(e) {console.log(e)}
var d = new Date(s * 1000);
s = d.getUTCFullYear() + “-”
+ (“0” + (d.getUTCMonth() + 1)).substr(-2) + “-”
+ (“0” + d.getUTCDate()).substr(-2) + “T”
+ (“0” + d.getUTCHours()).substr(-2) + “:”
+ (“0” + d.getUTCMinutes()).substr(-2) + “:”
+ (“0” + d.getUTCSeconds()).substr(-2);
return s;
};

// 問題
console.log(calc(“2016-01-01T01:00:00 + 2016-02-28T00:00:00 – 2016-02-02T00:00:00”));

// 出力結果
2016-01-27T01:00:00

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。