Separate and Count

The examples used here are from the weekly challenge problem statement and demonstrate the working solution.

Part 1

You are given an array of positive integers. Write a script to separate the given array into single digits.


use v5.38;
sub separate_digits{
    return separater([], @_); 

sub separater{
    my $seperated = shift;
    return @{$seperated} if @_ == 0;
    my @digits = @_;
    push @{$seperated}, split //, shift @digits;
    separater($seperated, @digits);

    say join q/,/, separate_digits 1, 34, 5, 6;

Sample Run

$ perl perl/ch-1.pl 


It has been a while since I wrote recursive Perl code, this week's TWC offered two nice chances to do so. The first call to separate_digits invokes the call to the recursive subroutine separater, adding an array reference for the convenience of accumulating the individual digits at each recursive step.

Within separater each number in the array is taken one at a time and expanded to its individual digits. The digits are pushed into the accumulator. When we run of digits we return the complete list of digits.

Part 2

You are given an array of words made up of alphabetic characters and a prefix. Write a script to return the count of words that starts with the given prefix.


use v5.38;
sub count_words{
    return counter(0, @_); 

sub counter{
    my $count = shift;
    my $prefix = shift;
    return $count if @_ == 0;
    my $word = shift;
    $count++ if $word =~ m/^$prefix/;
    counter($count, $prefix, @_);

    say count_words qw/at pay attention practice attend/;
    say count_words qw/ja janet julia java javascript/;

Sample Run

$ perl perl/ch-2.pl 


The exact same approach used for Part 1 is used here in the second part. Instead of accumulating am array of digits instead we increment the counter of words which start with the prefix characters.


Challenge 230

posted at: 21:40 by: Adam Russell | path: /perl | permanent link to this entry