Clock Angles
Wednesday, July 6, 2016
Programming Praxis posted about calculating clock angles, specifically to:
Write a program that, given a time as hours and minutes (using a 12-hour clock), calculates the angle between the two hands. For instance, at 2:00 the angle is 60°.
Wikipedia has a page about clock angle problems that we can pull a few test cases from:
{ 0 } [ "12:00" clock-angle ] unit-test
{ 60 } [ "2:00" clock-angle ] unit-test
{ 180 } [ "6:00" clock-angle ] unit-test
{ 18 } [ "5:24" clock-angle ] unit-test
{ 50 } [ "2:20" clock-angle ] unit-test
The hour hand moves 360° in 12 hours and depends on the number of hours
and minutes (properly handling midnight and noon to be 0°
):
:: hour° ( hour minutes -- degrees )
hour [ 12 = 0 ] keep ? minutes 60 / + 360/12 * ;
The minute hand moves 360° in 60 minutes:
: minute° ( minutes -- degrees )
360/60 * ;
Using these words, we can calculate the clock angle from a time string:
: clock-angle ( string -- degrees )
":" split1 [ number>string ] bi@
[ hour° ] [ minute° ] bi - abs ;