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{(},@*ARGS.map({|.comb}).join(q{, }),q{)}
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{)}
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()
.
my$p=@*ARGS.shift;@*ARGS.grep({/^$p/}).elems.say
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