Perl Weekly Challenge 338.
My solutions (task 1 and task 2 ) to the The Weekly Challenge - 338.
Task 1: Highest Row
Submitted by: Mohammad Sajid Anwar
You are given a m x n matrix.
Write a script to find the highest row sum in the given matrix.
Example 1
Input: @matrix = ([4, 4, 4, 4],
[10, 0, 0, 0],
[2, 2, 2, 9])
Output: 16
Row 1: 4 + 4 + 4 + 4 => 16
Row 2: 10 + 0 + 0 + 0 => 10
Row 3: 2 + 2 + 2 + 9 => 15
Example 2
Input: @matrix = ([1, 5],
[7, 3],
[3, 5])
Output: 10
Example 3
Input: @matrix = ([1, 2, 3],
[3, 2, 1])
Output: 6
Example 4
Input: @matrix = ([2, 8, 7],
[7, 1, 3],
[1, 9, 5])
Output: 17
Example 5
Input: @matrix = ([10, 20, 30],
[5, 5, 5],
[0, 100, 0],
[25, 25, 25])
Output: 100
This task is very simple using the Perl Data Language PDL
which
has methods sumover
to sum rows of a matrix, or more generally, of
an ndarray, and max
to get the maximum value of the resulting
array. The code fits a half-liner.
Examples:
perl -MPDL -E '
for(@ARGV){say "$_ -> ", pdl($_)->sumover->max}
' "[ [4 4 4 4][10 0 0 0][2 2 2 9]]" "[ [1 5][7 3][3 5]]" "[ [1 2 3][3 2 1]]" \
"[ [2 8 7][7 1 3][1 9 5]]" "[ [10 20 30][5 5 5][0 100 0][25, 25, 25]]"
Results:
[ [4 4 4 4][10 0 0 0][2 2 2 9]] -> 16
[ [1 5][7 3][3 5]] -> 10
[ [1 2 3][3 2 1]] -> 6
[ [2 8 7][7 1 3][1 9 5]] -> 17
[ [10 20 30][5 5 5][0 100 0][25, 25, 25]] -> 100
The full code is similar:
1 # Perl weekly challenge 338
2 # Task 1: Highest Row
3 #
4 # See https://wlmb.github.io/2025/09/07/PWC338/#task-1-highest-row
5 use v5.36;
6 use feature qw(try);
7 use PDL;
8 die <<~"FIN" unless @ARGV;
9 Usage: $0 M1 M2...
10 to find the maximum rowwise sum of the elements of the
11 matrices Mi. The inputs are strings of the form
12 "[[m00 m01...][m10 m11...]...]" which may be parsed
13 by pdl as a matrix
14 FIN
15 for(@ARGV){
16 try{say "$_ -> ", pdl($_)->sumover->max}
17 catch($e){warn $e}
18 }
I use try/catch
in case there are input errors.
Examples:
./ch-1.pl "[ [4 4 4 4][10 0 0 0][2 2 2 9]]" "[ [1 5][7 3][3 5]]" "[ [1 2 3][3 2 1]]" \
"[ [2 8 7][7 1 3][1 9 5]]" "[ [10 20 30][5 5 5][0 100 0][25, 25, 25]]"
Results:
[ [4 4 4 4][10 0 0 0][2 2 2 9]] -> 16
[ [1 5][7 3][3 5]] -> 10
[ [1 2 3][3 2 1]] -> 6
[ [2 8 7][7 1 3][1 9 5]] -> 17
[ [10 20 30][5 5 5][0 100 0][25, 25, 25]] -> 100
Task 2: Max Distance
Submitted by: Mohammad Sajid Anwar
You are given two integer arrays, @arr1 and @arr2.
Write a script to find the maximum difference between any
pair of values from both arrays.
Example 1
Input: @arr1 = (4, 5, 7)
@arr2 = (9, 1, 3, 4)
Output: 6
With element $arr1[0] = 4
| 4 - 9 | = 5
| 4 - 1 | = 3
| 4 - 3 | = 1
| 4 - 4 | = 0
max distance = 5
With element $arr1[1] = 5
| 5 - 9 | = 4
| 5 - 1 | = 4
| 5 - 3 | = 2
| 5 - 4 | = 1
max distance = 4
With element $arr1[2] = 7
| 7 - 9 | = 2
| 7 - 1 | = 6
| 7 - 3 | = 4
| 7 - 4 | = 4
max distance = 6
max (5, 6, 6) = 6
Example 2
Input: @arr1 = (2, 3, 5, 4)
@arr2 = (3, 2, 5, 5, 8, 7)
Output: 6
With element $arr1[0] = 2
| 2 - 3 | = 1
| 2 - 2 | = 0
| 2 - 5 | = 3
| 2 - 5 | = 3
| 2 - 8 | = 6
| 2 - 7 | = 5
max distance = 6
With element $arr1[1] = 3
| 3 - 3 | = 0
| 3 - 2 | = 1
| 3 - 5 | = 2
| 3 - 5 | = 2
| 3 - 8 | = 5
| 3 - 7 | = 4
max distance = 5
With element $arr1[2] = 5
| 5 - 3 | = 2
| 5 - 2 | = 3
| 5 - 5 | = 0
| 5 - 5 | = 0
| 5 - 8 | = 3
| 5 - 7 | = 2
max distance = 3
With element $arr1[3] = 4
| 4 - 3 | = 1
| 4 - 2 | = 2
| 4 - 5 | = 1
| 4 - 5 | = 1
| 4 - 8 | = 4
| 4 - 7 | = 3
max distance = 4
max (5, 6, 3, 4) = 6
Example 3
Input: @arr1 = (2, 1, 11, 3)
@arr2 = (2, 5, 10, 2)
Output: 9
With element $arr1[0] = 2
| 2 - 2 | = 0
| 2 - 5 | = 3
| 2 - 10 | = 8
| 2 - 2 | = 0
max distance = 8
With element $arr1[1] = 1
| 1 - 2 | = 1
| 1 - 5 | = 4
| 1 - 10 | = 9
| 1 - 2 | = 1
max distance = 9
With element $arr1[2] = 11
| 11 - 2 | = 9
| 11 - 5 | = 6
| 11 - 10 | = 1
| 11 - 2 | = 9
max distance = 9
With element $arr1[3] = 3
| 3 - 2 | = 1
| 3 - 5 | = 2
| 3 - 10 | = 7
| 3 - 2 | = 1
max distance = 7
max (8, 9, 9, 7) = 9
Example 4
Input: @arr1 = (1, 2, 3)
@arr2 = (3, 2, 1)
Output: 2
With element $arr1[0] = 1
| 1 - 3 | = 2
| 1 - 2 | = 1
| 1 - 1 | = 0
max distance = 2
With element $arr1[1] = 2
| 2 - 3 | = 1
| 2 - 2 | = 0
| 2 - 1 | = 1
max distance = 1
With element $arr1[2] = 3
| 3 - 3 | = 0
| 3 - 2 | = 1
| 3 - 1 | = 2
max distance = 2
max (2, 1, 2) = 2
Example 5
Input: @arr1 = (1, 0, 2, 3)
@arr2 = (5, 0)
Output: 5
With element $arr1[0] = 1
| 1 - 5 | = 4
| 1 - 0 | = 1
max distance = 4
With element $arr1[1] = 0
| 0 - 5 | = 5
| 0 - 0 | = 0
max distance = 5
With element $arr1[2] = 2
| 2 - 5 | = 3
| 2 - 0 | = 2
max distance = 3
With element $arr1[3] = 3
| 3 - 5 | = 2
| 3 - 0 | = 3
max distance = 3
max (4, 5, 3, 3) = 5
This is another problem that can be very simply solved with PDL
, as
it can convert 1D arrays to 2D matrices by adding dummy dimensions, i.e.,
repeating its columns or its rows, and adding dummy trailing
dimensions can be done intrinsically. Then I can subtract both
matrices, take the absolute value and search for the maximum . The result takes a one-liner.
Examples:
perl -MPDL -E '
for my ($x, $y)(@ARGV){say "$x, $y -> ", (pdl($x)-pdl($y)->dummy(0))->abs->max}
' "[4 5 7]" "[9 1 3 4]" "[2 3 5 4]" "[3 2 5 5 8 7]" "[2 1 11 3]" "[2 5 10 2]" \
"[1 2 3]" "[3 2 1]" "[1 0 2 3]" "[5 0]"
Results:
[4 5 7], [9 1 3 4] -> 6
[2 3 5 4], [3 2 5 5 8 7] -> 6
[2 1 11 3], [2 5 10 2] -> 9
[1 2 3], [3 2 1] -> 2
[1 0 2 3], [5 0] -> 5
This solution makes many unneeded subtractions. It would be enough to subtract the minima and maxima from both arrays. This yields a slightly longer but more efficient solution (for large arrays).
Examples:
perl -MPDL -MPDL::NiceSlice -E '
for my ($x, $y)(@ARGV){($p, $q)=map pdl(pdl($_)->minmax),($x,$y);say "$x, $y -> ",
($p-$q(-1:0))->abs->max}
' "[4 5 7]" "[9 1 3 4]" "[2 3 5 4]" "[3 2 5 5 8 7]" "[2 1 11 3]" "[2 5 10 2]" \
"[1 2 3]" "[3 2 1]" "[1 0 2 3]" "[5 0]"
Results:
[4 5 7], [9 1 3 4] -> 6
[2 3 5 4], [3 2 5 5 8 7] -> 6
[2 1 11 3], [2 5 10 2] -> 9
[1 2 3], [3 2 1] -> 2
[1 0 2 3], [5 0] -> 5
The full code corresponding to the last solution is:
1 # Perl weekly challenge 338
2 # Task 2: Max Distance
3 #
4 # See https://wlmb.github.io/2025/09/07/PWC338/#task-2-max-distance
5 use v5.36;
6 use feature qw(try);
7 use PDL;
8 use PDL::NiceSlice;
9 die <<~"FIN" unless @ARGV and @ARGV%2==0;
10 Usage: $0 X1 Y1 X2 Y2...
11 to find the maximum distance between the elements of array Xi and Yi.
12 The inputs Xi and Yi are strings that may be parsed by ~PDL~ as arrays
13 of the form "[z0 z1...]"
14 FIN
15 for my ($x, $y)(@ARGV){
16 try {
17 # initialize $p and $q with the min and max of each input
18 my ($p, $q)=map {pdl(pdl($_)->minmax)} ($x,$y);
19 # reverse one array to subtract minimum from maximum and maximum from minimum
20 my $result = ($p-$q(-1:0))->abs->max;
21 say "$x, $y -> ", $result;
22 }
23 catch($e){ warn $e }
24 }
Example:
./ch-2.pl "[4 5 7]" "[9 1 3 4]" "[2 3 5 4]" "[3 2 5 5 8 7]" "[2 1 11 3]" "[2 5 10 2]" \
"[1 2 3]" "[3 2 1]" "[1 0 2 3]" "[5 0]"
Results:
[4 5 7], [9 1 3 4] -> 6
[2 3 5 4], [3 2 5 5 8 7] -> 6
[2 1 11 3], [2 5 10 2] -> 9
[1 2 3], [3 2 1] -> 2
[1 0 2 3], [5 0] -> 5
/;