時計の針
(2013/11/30)
時計の短針と長針の区別が無いと困るのか? ということについて考えてみた。
http://gyazo.com/03438094048178fd0ecb52d282d10ebd.png
上図の左側は「2:00」で、右は「0:10」であることは短針/長針から明白だが、 下図のように針に区別がなくても左側が「2:00」で右側が「0:10」であることは判別できる。 長針/短針を常に判別可能なのであれば異なる針を使う必要が無いかもしれない。
http://gyazo.com/f6f230d3ab1def245a3ba98226a09ac9.png
二本の針のどちらが短針なのかか判別できない場合があるのであれば 長針/短針を区別する必要があるだろう。 この可能性について計算してみた。
時刻$ X (e.g. 1時30分の場合 $ X = 1.5) の短針/長針の位置は以下のようになる。 ここで$ frac(x)は実数の小数部分を計算する関数である。 (e.g. $ frac(1.5) = 0.5)
短針位置: $ X \times 360 / 12
長針位置: $ frac(X) \times 360
時刻$ Xの短針/長針位置と 時刻$ Yの長針/短針位置が同じになる場合、 以下の式が成立するはずである。
$ X \times 360 / 12 = frac(Y) \times 360
$ Y \times 360 / 12 = frac(X) \times 360
両辺を30で割って変形すると以下のようになる。
$ X = frac(Y) \times 12
$ Y = frac(X) \times 12
つまり、以下の式を満足する$ Xが存在すれば、 時刻$ Xと時刻$ Y ($ = frac(X) * 12) の長針/短針パタンが一致することになる。
$ X = frac(frac(X) \times 12) \times 12
$ frac(x)は非線型関数なので普通にこれを解く方法を知らないのだが、
$ 0 ≤ x < 1のとき$ frac(x) = x
$ 1 ≤ x < 2のとき$ frac(x) = x-1
...
$ 11 ≤ x < 12のとき$ frac(x) = x-11
という性質があるので、 0から11までの整数 i, j のあらゆるパタンについて 以下の式を満たすものがあるかを調べればよい。
((x - i) * 12 - j) * 12 = x (ただし i ≤ x < i+1, j ≤ frac(x) * 12 < j+1)
これを変形すると
x = (144 * i + 12 * j) / 143
となるので、これを使って以下のようなプログラムで x を計算することができる。
code:clock.rb
def int(x)
x.to_i
end
def frac(x)
x.to_f - int(x)
end
def ts(x)
"#{x.to_i}時#{frac(x)*60.0}分"
end
(0..12).each { |i|
(0..12).each { |j|
x = (144.0 * i + 12.0 * j) / 143.0
y = frac(x) * 12.0
if i <= x && x < i+1 && j <= y && y < j+1 then
end
}
}
これを実行すると以下のような結果が得られた。
0時5.03496503496504分 と 1時0.419580419580425分 の針位置は一致
0時10.0699300699301分 と 2時0.839160839160851分 の針位置は一致
0時15.1048951048951分 と 3時1.25874125874128分 の針位置は一致
0時20.1398601398601分 と 4時1.6783216783217分 の針位置は一致
0時25.1748251748252分 と 5時2.0979020979021分 の針位置は一致
「0時10.07分」と「2時0.84分」の針の位置は一致するし、そのようなパタンは沢山ある。 やはり短針と長針は区別しなければならないようである。