stylesheet

2017年6月17日土曜日

針の長さが同じ時計問題

問題

長針と短針が同じ長さの時計がある。この時計で 0:00 から 12:00 までの間に、時間を決められないのは何回あるか?
  1. 外の明るさを知ることは出来ない(あなたは閉じ込められている)。
  2. 1分前の時間を覚えておくことは出来ない(あなたは記憶障害)。
  3. 第三者から時間を教えてもらうことは出来ない(あなたはひとりぼっち)。

時計

Hour:
Minutes:
Seconds:




時計1

短針と長針が同じ長さの次のような時計がある。
  1. 長針は一時間に360度を動く。
  2. 短針は一時間に360/12度を動く。
  3. 短針は毎時、長針は毎分に角度を変える。

考え方

このような時計の場合、文字盤を指していない針は長針に決まっている。よって時間の区別が付かなくなるのは、長針と短針が両方とも文字盤を指している場合である。

1時間の間に長針が文字盤を指す回数は12回。一時間に12回なので、12時間ならば12×12=144回ある。

そのうち、長針と短針が同じ文字盤を指す場合、つまり完全に重なる場合、例えば2時10分、3時15分などは12回ある。この場合は、時間は分かるので144回-12回=132回が答えとなる。

この時計の針が作る角度は次の式で求まる。
長針360/3600*Minutes(0~59)
短針30*Hour(0~11)

時計2

さて、次に短針と長針が同じ長さの次のような時計がある。
  1. 長針は一時間に360度を動く。
  2. 短針は一時間に360/12度を動く。
  3. 短針は毎分、長針は毎秒に角度を変える。

考え方

このような時計の場合、時計で時間の見分けがつかないのはどういう状況だろうか。

長針と短針が進む角度。
時間時°分°
360/12=30360
30/60=0.5360/60=6
0.5/60=0.0083336/60=0.1

3:26:40 の針の角度。
角度
長針360/3600*(26*60+40)160°
短針30*3 + 30/60*26103°



時計の針は、必ずどちらかが短針である。更に時計の針は多くない。だから、取り合えず任意の針を短針と仮定する。その針の角度から時間を求め、もう片方を長針と仮定して時間を求める。

この時、短針の角度には、"時"だけでなく、"分"の情報も含まれている事が大切である。時計2では短針だけで"時分"が分かるのである。よって本当は長針に存在価値などない。時間を示すだけなら短針だけで十分だからである。

それなのに、なぜ長針が必要かと言えば、人間の視覚がとろいからである。短針の角度だけでは"分"がよく分からない。だから長針でも分を示すことにした。だから短針にも長針にも"分"の情報が含まれているのである。

針が一本だけならそれは短針である。二本あるからどちらが短針かを見極めないといけなくなった。普通はそれを長さや太さや色で示す。一般的に棒状のものはそうやって見分けるのである。

そこで、ふたつの針(秒針は含まない)が異なる"分"を指しているならば、話は簡単である。長針と短針を間違えている。入れ替えて計算してみれば、"分"は一致するであろう(例えば長針だけが止まっているような壊れた時計の場合はその限りではない)。

ふたつの針で"分"の正しさ(本当の分を指している)の組み合わせにはどれだけのパターンがあるだろうか。
  1. 針1の分と針2の分が正しい分を指している場合
  2. 針1の分が正しく針2の分が正しくない場合
  3. 針1の分が正しくなく針2の分が正しい場合
  4. 針1の分と針2の分がどちらも正しくない場合
Matrixにすると
針1針2
分が一致する
×長針と短針を間違えている
×長針と短針を間違えている
××壊れている時計

短針だけで"分"が求まるという事は、その時にもう片方の針も同じ"分"を示しているかを確かめてみれば分かる。もし同じ"分"でないなら、その針を今度は短針にして同じ計算をすれば一致する。この場合は、時間がただひとつに決まる場合である。

よってふたつの針が同じ"分"を示しているのに、針を入れ替えても同じ"分"(先ほど求めた分と同じ数値ではない)になる場合がある、というのがこの問題である。世の中にはこれをオイラーの等式(e+1=0)を使って(角度はπを使って表現できる)カッコよく求めている人もいるが、ここはプログラムを使って総当たりで見つけてしまえという話。

x時y分z秒の角度は以下の式で求める。この求めたそれぞれの針の角度から時分秒を逆算して比較する。
長針360/3600*(Minutes*60+Seconds)
短針30*Hour + 30/60*Minutes
function calcCount (hmax) {
 var t = 0;
 var c = 0;
 var text = "";
 for(var h=0; h<hmax; ++h) {
  for(var m=0; m<60; ++m) {
   for(var s=0; s<60; ++s) {
    //h:m:sの角度を算出する。
    var ha = 30*h + 30/60*m;
    var ma = 360/3600*(m*60+s);
    //求めた角度に対して短針として時分を求める。
    var ha1h = (ha / 30)|0;
    var ha1m = (ha % 30) / 0.5;
    var ma1h = (ma / 30)|0;
    var ma1m = (ma % 30) / 0.5;
    //求めた角度に対して長針として分秒を求める。
    var ha2m = (ha / 6)|0;
    var ha2s = (ha % 6) * 10;
    var ma2m = (ma / 6)|0;
    var ma2s = (ma % 6) * 10;
    //どちらで計算しても時刻として矛盾しないならば、見分けが付かない。
    if( ha1m == ma2m ) if( ma1m == ha2m ) if( ha1h != ma1h ) {
      c += 1;
      text += "("+(h+":"+m+":"+s+") ("+ma1h+":"+ma1m+":"+ma2s+") - angle("+ha+", "+ma+")<br/>");
    }
    t += 1;
   }
  }
 }
 return [c,t,text];
}

結果





0 件のコメント:

コメントを投稿