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.