Perl Weekly Challenge 119: numbers

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 110.

PWC 119 - Task 1

The first task was about rotating nibbles, that means convert an integer to a bit string, and switch the half-octect, printing out the resulting number. One constraint that makes it really simple is that the incoming number must be less than 256, that means we have a single octet and thus two nibbles.

sub MAIN( Int $N where { $N < 256 && $N >= 0 } ) {

    # create an 8 digits binary string
    '%08d'.sprintf( $N.base( 2 ) )
    # separate each digit into an array
    .split( '', :skip-empty )
    # rotate by four elements
    .rotate( 4 )
    # recombine
    .join
    # reparse as binary
    .Str
    .parse-base( 2 )
    # and print
    .say;

}



A single line does it all:
  • I convert the SN to binary by means of base( 2 );
  • I print it as an eight digit string, placing leading zeroes by means of printf;
  • I split the string into a single array of digits;
  • I use rotate that takes 4 elements of the array and rotate to the left the elements;
  • I join the obtained digits and convert them as a string;
  • I compute the base 10 value by means of parse-base and then I print out the result.

PWC 119 - Task 2

The second task was about generating a strange sequence of numbers, and printing out only the selected one. I used the gather and take construct here to load a lazy array of numbers:

sub MAIN( Int $N where { $N > 0 } ) {

    my @numbers = lazy gather {
        for 1 .. Inf {
            next if $_ ~~ / (11)+ /;
            next if $_ ~~ / <[04..9]> /;
            
            take $_;
            
        }
    }

    @numbers[ $N - 1 ].say;
}



I skip, by means of next the values that do not correspond to the requirements, those with repetitions of 1 and digits that are not 2, 3 or 1 itself. In the last, I print the required number, even if it took me a while to figure out that the exercise was asking about a numbering starting from one and not from zero as per a regular array.

Wait a minute: what about PWC 118?

I was on holiday, without any computer at all!

The article Perl Weekly Challenge 119: simpler than it seems has been posted by Luca Ferrari on June 28, 2021