時計の針
(2013/11/30)
時計の短針と長針の区別が無いと困るのか? ということについて考えてみた。
上図の左側は「2:00」で、右は「0:10」であることは短針/長針から明白だが、 下図のように針に区別がなくても左側が「2:00」で右側が「0:10」であることは判別できる。 長針/短針を常に判別可能なのであれば異なる針を使う必要が無いかもしれない。
二本の針のどちらが短針なのかか判別できない場合があるのであれば 長針/短針を区別する必要があるだろう。 この可能性について計算してみた。
時刻 (e.g. 1時30分の場合 ) の短針/長針の位置は以下のようになる。 ここでは実数の小数部分を計算する関数である。 (e.g. )
短針位置:
長針位置:
時刻の短針/長針位置と 時刻の長針/短針位置が同じになる場合、 以下の式が成立するはずである。
両辺を30で割って変形すると以下のようになる。
つまり、以下の式を満足するが存在すれば、 時刻と時刻 () の長針/短針パタンが一致することになる。
は非線型関数なので普通にこれを解く方法を知らないのだが、
のとき
のとき
...
のとき
という性質があるので、 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 を計算することができる。
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
puts "#{ts(x)} と #{ts(y)} の針位置は一致"
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分」の針の位置は一致するし、そのようなパタンは沢山ある。 やはり短針と長針は区別しなければならないようである。