# Re: Factor

Factor: the language, the theory, and the practice.

## 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 ;
``````