Perl Weekly Challenge: Week 230

A relaxing week this time. I was able to do both challenges in half an hour.

Challenge 1:

Separate Digits

You are given an array of positive integers.

Write a script to separate the given array into single digits.

Example 1
Input: @ints = (1, 34, 5, 6)
Output: (1, 3, 4, 5, 6)
Example 2
Input: @ints = (1, 24, 51, 60)
Output: (1, 2, 4, 5, 1, 6, 0)

All we need to do to solve this in Raku is to iterate over each command-line argument with .map(), split each argument into digits with.comb() plus the | operator for "flattening" the result to get digits rather than a list of digits and join the digits together again with .join(). The rest of this one-liner is just for getting the output into the same format as in the examples.

say q{(},@*{|.comb}).join(q{, }),q{)}

(Full code on Github.)

We can do the same thing in Perl. Remarkably the Perl version is actually shorter than Raku because we don't need |; Perl flattens by default.

say q{(},(join q{, },map{split//}@ARGV),q{)}

(Full code on Github.)

Challenge 2:

Count Words

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.

Example 1
Input: @words  = ("pay", "attention", "practice", "attend")
       $prefix = "at"
Ouput: 2

Two words "attention" and "attend" starts with the given prefix "at".
Example 2
Input: @words  = ("janet", "julia", "java", "javascript")
       $prefix = "ja"
Ouput: 3

Three words "janet", "java" and "javascript" starts with the given prefix "ja".

Also a one-liner. We take out the first command-line argument to use as the prefix (assigned to $p for brevity.) Then we search through the rest of the arguments with .grep() using a regular expression to find ones that start with the prefix. Once we have those, we count them up with .elems() and print the result with .say().


(Full code on Github.)

The Perl version works the same way modulo the usual differences in syntax. Once again it is shorter than the Raku version--this time remarkably so. Overall I prefer the consistency of Raku's syntax for real world applications.

$p=shift;say scalar grep{/^$p/}@ARGV

(Full code on Github.)