Perl Weekly Challenge 120: quick and dirt

One way to let me improve my knowledge about Raku (aka Perl 6) is to implement programs in it. Unluckily, I don’t have any production code to implement in Raku yet (sob!). So, why not try solving the Perl Weekly Challenge tasks?

In the following, the assigned tasks for Challenge 120.

PWC 120 - Task 1

The first task was about rotating, or better exchanging, bits position in abinary representation of a number: an odd bit has to be exchanged with its even pair and viceversa. I decided to do that with a temporary array where I store the exchanged bits:

sub MAIN( Int $N where { 0 < $N < 255 } ) {
    my @bits = '%08s'.sprintf( $N.base( 2 ) ).split( '', :skip-empty );

    my @rotated-bits;
    for my @bits -> $odd, $even {
        @rotated-bits.push: $even, $odd;
    }


    @rotated-bits.join.Str.parse-base( 2 ).say;
}




I store the binrary representation of the number in the @bits array, already expanded to an eight bit representation. I then extract all the couples of elements and exchange them into @rotted-bits, and finally I join and reconvert by parse(2) from binrary to decimal notation.

PWC 120 - Task 2

In the second task there was the need to compute the minimal angle between clock arms, given a string representing the time:

sub MAIN( Str $time where { $time ~~ / ^ \d ** 2 ':' \d ** 2 $ / } ) {
    my ( $hour, $minute ) = $time.split( ':', :skip-empty );

    $hour   %= 12;
    $minute %= 60;
    $minute /= 5;

    say abs( $hour - $minute )  * 30;
}



First of all, I do extract the numeric values for $hour and $minute from the string representing the time. After that, I do convert the time so that the values are always within the range 1..12 and 1..60, and then I compute the value of the minutes by its offset of 5 minutes. This makes me find out what tick the $hour and $minute are pointing to.
Having the ticks, it does suffice to multiple the difference for the angle between the ticks to get the result.

The article Perl Weekly Challenge 120: quick and dirt has been posted by Luca Ferrari on July 5, 2021