This week, two simple tasks were offered for our entertainment.
Count trailing zeros
The task is to count trailing zeros in a factorial of a given integer number.
Computing factorials is my favourite task in Raku, and it is an extremely simple task:
my $f = [*] 1..$n;
Counting zeroes at the end of the string is a bit trickier:
say ($f ~~ / 0+ $/ // '').chars;
The number is treated as a string here, and if there are trailing zeroes, they will be taken to a Match object, which you can then implicitly convert to a string and take its length. If there are no zeros, we take an empty string instead.
So, the whole program is here:
unit sub MAIN(Int $n); my $f = [*] 1..$n; say "$n! = $f"; say ($f ~~ / 0+ $/ // '').chars;
Run it to see how it works:
$ raku ch-1.raku 10 10! = 3628800 2
The second task is to take a text file
input.txt and print the lines between A and B, where A and B are integers corresponding the existing line numbers in the file.
Well, this task is rather simple, and can be done as a one-liner:
unit sub MAIN(Int $a, Int $b where 0 < $a <= $b <= 100); .say for 'input.txt'.IO.lines[$a-1 ..^ $b];
If the file is small enough, you don’t have to worry about the efficiency of the program. For bigger files, probably, too, as
lines returns a Supply, and I hope that it is lazy, so the program will not take the whole file in memory before you can read its first lines.