This is a solution of the Task 2 from Week 57 of the Perl Weekly Challenge.
Find the shortest unique prefixes for the given list of words.
In other words, for every word from a list, find its shortest prefix that is not a prefix of any other word in the same list.
Here is the list of words:
my @words = < alphabet book carpet cadmium cadeau alpine >;
Let us just loop over it and prepare the list of other words:
for @words -> $word { my @other_words = @words.grep: * ne $word; . . . }
The @other_words
array contains everything from the original array except the current word.
Now, loop over all possible prefixes of the current word:
for 1..$word.chars -> $length { my $prefix = $word.substr(0, $length); . . . }
Finally, test if this prefix can be a prefix of any other word:
unless @other_words.first: * ~~ /^$prefix/ { say $prefix; last; }
If there is no such prefix, this is what we are looking at. So we can stop any further searches for the current word. Here, the two elements help to stop the iteration asap: these are using the first
method and the last
keyword.
Here is the whole program together:
my @words = < alphabet book carpet cadmium cadeau alpine >; for @words -> $word { my @other_words = @words.grep: * ne $word; for 1..$word.chars -> $length { my $prefix = $word.substr(0, $length); unless @other_words.first: * ~~ /^$prefix/ { say $prefix; last; } } }
This program prints the following output:
$ raku ch-2.raku alph b car cadm cade alpi
→ GitHub repository
→ Navigation to the Raku challenges post series