Perl Weekly Challenge 240.
My solutions (task 1 and task 2 ) to the The Weekly Challenge - 240.
Task 1: Acronym
Submitted by: Mohammad S Anwar
You are given an array of strings and a check string.
Write a script to find out if the check string is the acronym of the words in the given array.
Example 1
Input: @str = ("Perl", "Python", "Pascal")
$chk = "ppp"
Output: true
Example 2
Input: @str = ("Perl", "Raku")
$chk = "rp"
Output: false
Example 3
Input: @str = ("Oracle", "Awk", "C")
$chk = "oac"
Output: true
From the example, the array is assumed ordered. So I only have to join the first letter of each word in order to build the acronym. I can normalize it to lowercase. I assume the acronym is the first element of @ARGC and the other elements form the array. The result is a oneliner.
Example 1:
perl -E '
$x=shift; say "$x <= @ARGV: ", lc $x eq (lc join "", map {substr $_, 0,1} @ARGV)?"True":"False"
' ppp Perl Python Pascal
Results:
ppp <= Perl Python Pascal: True
Example 2:
perl -E '
$x=shift; say "$x <= @ARGV: ", lc $x eq (lc join "", map {substr $_, 0,1} @ARGV)?"True":"False"
' rp Perl Raku
Results:
rp <= Perl Raku: False
Example 3:
perl -E '
$x=shift; say "$x <= @ARGV: ", lc $x eq (lc join "", map {substr $_, 0,1} @ARGV)?"True":"False"
' oac Oracle Awk C
Results:
oac <= Oracle Awk C: True
The full code is similar:
1 # Perl weekly challenge 240
2 # Task 1: Acronym
3 #
4 # See https://wlmb.github.io/2023/10/23/PWC240/#task-1-acronym
5 use v5.36;
6 die <<~"FIN" unless @ARGV;
7 Usage: $0 A W1 [W2...]
8 to test if A is an acronym of the words W1, W2...
9 FIN
10 my $acronym=shift;
11 say "$acronym <= @ARGV: ", lc $acronym eq (lc join "", map {substr $_, 0,1} @ARGV)?"True":"False"
Examples:
./ch-1.pl ppp Perl Python Pascal
./ch-1.pl rp Perl Raku
./ch-1.pl oac Oracle Awk C
Results:
ppp <= Perl Python Pascal: True
rp <= Perl Raku: False
oac <= Oracle Awk C: True
Task 2: Build Array
Submitted by: Mohammad S Anwar
You are given an array of integers.
Write a script to create an array such that new[i] = old[old[i]] where 0 <= i < new.length.
Example 1
Input: @int = (0, 2, 1, 5, 3, 4)
Output: (0, 1, 2, 4, 5, 3)
Example 2
Input: @int = (5, 0, 1, 2, 3, 4)
Output: (4, 5, 0, 1, 2, 3)
Perl allows indexing an array by an array to produce an array. This yields an extremely compact solution.
Example 1:
perl -E '@x=@ARGV; say "@x -> @x[@x]"' 0 2 1 5 3 4
Results:
0 2 1 5 3 4 -> 0 1 2 4 5 3
(Choroba got this solution first!)
Example 2:
perl -E '@x=@ARGV; say "@x -> @x[@x]"' 5 0 1 2 3 4
Results:
5 0 1 2 3 4 -> 4 5 0 1 2 3
Interestingly, the operation may be iterated, yielding fixed points or periodic orbits:
perl -E '@x=@ARGV; print("@x ->"), @x=@x[@x] for 1..6; say "..."' 0 2 1 5 3 4
Results:
0 2 1 5 3 4 ->0 1 2 4 5 3 ->0 1 2 5 3 4 ->0 1 2 4 5 3 ->0 1 2 5 3 4 ->0 1 2 4 5 3 ->...
The full code is almost identical, with a couple of tests.
1 # Perl weekly challenge 240
2 # Task 2: Build Array
3 #
4 # See https://wlmb.github.io/2023/10/23/PWC240/#task-2-build-array
5 use v5.36;
6 use List::Util qw(min max);
7 die <<~"FIN" unless @ARGV;
8 Usage: $0 N0 [N1...]
9 to iterate indexing the array N0, N1...
10 FIN
11 die "Elements should be >=0 and < #of elements" unless 0<=min @ARGV && max @ARGV<@ARGV;
12 say "@ARGV -> @ARGV[@ARGV]";
Examples:
./ch-2.pl 0 2 1 5 3 4
./ch-2.pl 5 0 1 2 3 4
Results:
0 2 1 5 3 4 -> 0 1 2 4 5 3
5 0 1 2 3 4 -> 4 5 0 1 2 3
/;