Perl Weekly Challenge 135: in a rush
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 135.
PWC 135 - Task 1
The first task was about finding the three middle digits in a given number, assuming it has an odd number of digits. This is implemented as:sub MAIN( Int $n ) {
    $n.abs.say and exit if $n.Str.chars == 3;
    'too short'.say and exit if $n.Str.chars < 3;
    'even number of digits'.say and exit if $n.Str.chars %% 2;
    my $remove = ( $n.Str.chars - 3 ) / 2;
    $n.Str.comb[ $remove ..^ $remove + 3 ].join.say;
}
The
$remove variable contains how many character it is need to remove from the left and right of the digit, and then I comb the input digit and slice it, re-join and print.
PWC 135 - Task 2
The second task was about validating SEDOL strings. It took me more to understand the alghoritm than to implement it.sub MAIN( Str $SEDOL ) {
    my %map-of-digits;
    for flat 0 ..9, 'A' .. 'Z' {
        %map-of-digits{ $_ } = $++;
    }
    my @weights     = 1, 3, 1, 7, 3, 9;
    my @values      = %map-of-digits{ $SEDOL.comb };
    my $sum         = [+] @values Z* @weights;
    my $check_digit = (10 - $sum % 10) % 10;
    "1".say and exit if $SEDOL ~~ / $check_digit $ /;
    0.say;
}
The
%map-of-digits is an hash where each digit is used as key, and the value is the digit to be used in the sum. The @values extracts the values to be summed using the comb of the input string, so each key in the hash.
Then summatory is made using the [+] reduction operator on the zip multiplication of each value for its weigth.
The the $check_digit is computed as the alghoritm wants. Last, if the input string is ending with the check digit, the program prints 1 and exits, otherwise it prints 0 and terminates.