Perl Weekly Challenge 104: recursion and picking

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

PWC 104 - Task 1

The first task was quite simple: it required to compute a FUSC sequence, that is something that can be computed recusrively. Since Raku allows for parameter value overloading of a function, why not use that?

multi sub fusc( 0 ) { 0 }
multi sub fusc( 1 ) { 1 }
multi sub fusc( $n where { $n > 1 } ) {
    return samewith( ( $n / 2 ).Int ) if $n %% 2;
    return samewith( ( ( $n - 1 ) / 2 ).Int ) + samewith( ( ( $n + 1 ) / 2 ).Int );
}


sub MAIN(){
    "fusc( $_ ) = { fusc( $_ )}".say for 0 .. 10;
}
The idea is to define a fusc function that will have fixed values for 0 and 1 and will recursively call itself by mean of samewith with different arguments. There is the need to add a cast to Int or the recursive call will not be able to find out the correct candidate.

PWC 104 - Task 2

The second task was about a game where the players have to pick 1 or 2 or 3 tokens at the same time, and the one that picks the last token from a group of 12 wins. I’ve implemented it using an array of @tokens from which I remove a random number of tokens at every round, for two players:

sub MAIN() {
    # all tokens are True-selectable
    my @tokens = True xx 12;

    my @players = <Player1 Player2>;

    while ( @tokens.elems > 0 ) {
        for @players -> $player {
            my $how-many = ( 1 .. min( 3, @tokens.elems ) ).pick;
            @tokens.pop for 1 .. $how-many;
            say "$player picks $how-many, remaining { @tokens.elems }";

            if @tokens.elems == 0 && $how-many > 0 {
                "Player $player won!".say && exit;
            }
        }

    }

}
}


At every round the @tokens array is reduced by a random number between the maximum of 3 and the number of remaining tokens. The player that picks the last token in that round wins and terminates the whole application.

The article Perl Weekly Challenge 104: recursion and picking has been posted by Luca Ferrari on March 15, 2021