Advent Calendar 2021
| Day 9 | Day 10 | Day 11 |
The gift is presented by Roger Bell_West. Today he is talking about his solution to “The Weekly Challenge - 120”. This is re-produced for Advent Calendar 2021 from the original post by Roger Bell_West
.
Task #2: Clock Angle
You are given time $T in the format hh:mm
.
Write a script to find the smaller angle formed by the hands of an analog clock at a given time.
Which seems again as though it has a fairly straightforward solution: determine the angle of each hand, then reduce the difference.
Raku:
sub ca($n) {
my $a=0;
Extract hour and minute:
if ($n ~~ /(<[0..9]>+)\:(<[0..9]>+)/) {
Convert each one to an angle (note that each minute puts half a degree on the hour hand, so we’re in floating point territory):
my ($ha,$ma)=map {$_ % 360}, ($0*30+$1/2,$1*6);
Take the absolute difference:
$a=abs($ha-$ma);
Reduce until we get an angle lying in (-180..180):
while ($a > 180) {
$a-=360;
}
And take the absolute again.
$a=abs($a);
}
return $a;
}
The complete solution in Raku.
#! /usr/bin/perl6
use Test;
plan 2;
is(ca('03:10'),35,'example 1');
is(ca('04:00'),120,'example 2');
sub ca($n) {
my $a=0;
if ($n ~~ /(<[0..9]>+)\:(<[0..9]>+)/) {
my ($ha,$ma)=map {$_ % 360}, ($0*30+$1/2,$1*6);
$a=abs($ha-$ma);
while ($a > 180) {
$a-=360;
}
$a=abs($a);
}
return $a;
}
If you have any suggestion then please do share with us perlweeklychallenge@yahoo.com.