42
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaScript: 時計の短針と長針はいつ重なるか

Last updated at Posted at 2019-05-03

報われないのは鐘のあと

時計ってすごくおもしろくて。
毎時1回は重なるようにできてるんですけど、11時台だけは重ならないの。11時台だけは短針が先に逃げ切っちゃって、ふたつの針って重ならないんですよ。
伝えたいメッセージが何かというと『鐘が鳴る前は報われない時間があるということ』

ここで感動した人は、科学的に考えるくせをつけた方がよいでしょう。鐘がなったのちの0時から1時までの間に、ふたつの針が重なることはありません1。長針が短針に追いつくまでに要する時間は、約65分27秒だからです。この話でいうなら、鐘が鳴ったあとこそ報われないことになります。話を1時から始めているのがトリックです。

この計算は、算数で「旅人算」または「追越算」と呼ばれます。先に外出した弟の忘れ物を、兄が追いかけて渡そうとしたりするアレです(下はイメージ動画)。

英進館CM:「歩く男」

英進館CM:「歩く男」 60秒ver
>> YouTubube動画

分単位の近似値

算数としては、1時から12時まで場合分けして計算することになります。でも、面倒なので近似値をJavaScriptコードで求めてみましょう。知りたいのは時刻ですから、角度は使いません。長針が60分で1周するトラックを、短針の1周にかかる12時間で、長針はいつどこで追い越すか考えればよいのです。

for (let t = 0; t < 60 * 12; t += 0.1) {
    const hours = t / 12;
    const minutes = t % 60;
    if (Math.floor(hours * 10) === Math.floor(minutes * 10)) {
        console.log(Math.floor(hours / 5), Math.round(minutes));
    }
}

コンソールの出力はつぎのとおりです。分未満は丸めてあります。ひとつめの数字が時、ふたつめが分です。11時台は60分に追いつくとみなせます。

0 0
1 5
2 11
3 16
4 22
5 27
6 33
7 38
8 44
9 49
10 55
11 60

秒まで測ってみる

もう少し正確に、秒まで測ってみましょう。今度は、トラックを12時の単位で刻むことにします。時速は、長針が$12メモリ/h$、短針は$1メモリ/h$ということです。長針が$1:00$ちょうどから、初めて短針に重なるまでにかかる時間を$t$として、算数ですけど方程式を使わせてもらいます。1メモリ先にいる短針に、長針がいつ追いつくかです。

12t = 1 + t\\
t = \frac{1}{11}

よって、$0:00$から数えれば、長針が短針に追いつくのに要する時間は約$65.455$分となります2

60 \times (1 + \frac{1}{11}) = \frac{60 \times 12}{11} \approx 65.455

時刻表示に直すのは、JavaScriptに任せましょう。Dateオブジェクトの日時メソッドは、引数に大きな値を渡すと、繰り上げて設定してくれます。ですから、ミリ秒に換算して加えました。

[追記: 2019/05/04] 以下のコードの計算精度を高めました。前の記述は、ご参考までにコメントアウトで残してあります。これにより、最後の出力がミリ秒の誤差を積算した11:59:59から改善されました。

const interval = 60 * 12 / 11;
// const time = new Date(2019, 4, 3);
for (let hours = 0; hours < 12; hours++) {
    const time = new Date(2019, 4, 3);  // 移動
    time.setMilliseconds(hours * interval * 60 * 1000);  // 修正
    console.log(time.toString().split(' ')[4]);
    // time.setMilliseconds(time.getMilliseconds() + interval * 60 * 1000);
}
00:00:00
01:05:27
02:10:54
03:16:21
04:21:49
05:27:16
06:32:43
07:38:10
08:43:38
09:49:05
10:54:32
12:00:00
  1. いや、0:00に重なって始まっている、という指摘があろうことは承知です。この重なり合いが11時台と重複する、それをどちらにカウントするかで「報われない時間」は変わります。でも、0:00の鐘をスタートとするなら、重なりは始まりだということです。そうすると、10:54の鐘ではじまった時間が、0:00に静かに幕を閉じるとしなければなりません。重なりを終わりで数えるのであれば、0:00の鐘はスタートでなく、11:60の鐘で11時台を終えなければならないはずです。

  2. $\frac{12}{11}$という分数は、12時間の11等分を意味します。つまり、ふたつの針が重なるのはその時刻だということです。

42
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?