Perl Weekly Challenge 217.

My solutions (task 1 and task 2 ) to the The Weekly Challenge - 217.

``````Submitted by: Mohammad S Anwar
You are given a n x n matrix where n >= 2.

Write a script to find 3rd smallest element in the sorted matrix.

Example 1
Input: @matrix = ([3, 1, 2], [5, 2, 4], [0, 1, 3])
Output: 1

The sorted list of the given matrix: 0, 1, 1, 2, 2, 3, 3, 4, 5.
The 3rd smallest of the sorted list is 1.
Example 2
Input: @matrix = ([2, 1], [4, 5])
Output: 4

The sorted list of the given matrix: 1, 2, 4, 5.
The 3rd smallest of the sorted list is 4.
Example 3
Input: @matrix = ([1, 0, 3], [0, 0, 0], [1, 2, 1])
Output: 0

The sorted list of the given matrix: 0, 0, 0, 0, 1, 1, 1, 2, 3.
The 3rd smallest of the sorted list is 0.
``````

Curiously, the fact that the input is a square matrix is never used, just its contents. Nevertheless, I use the Perl Data Language PDL to easily manipulate the matrices, yielding a short oneliner

Example 1

``````perl -MPDL -E 'for(@ARGV){\$x=pdl(\$_);say "\$x->", \$x->flat->qsort->at(2)}' '[[3,1,2],[5,2,4],[0,1,3]]'
``````

Results:

``````[
[3 1 2]
[5 2 4]
[0 1 3]
]
->1
``````

Other examples:

``````perl -MPDL -E 'for(@ARGV){\$x=pdl(\$_);say "\$x->", \$x->flat->qsort->at(2)}' \
'[[2,1],[4,5]]' '[[1,0,3],[0,0,0],[1,2,1]]'
``````

Results:

``````[
[2 1]
[4 5]
]
->4

[
[1 0 3]
[0 0 0]
[1 2 1]
]
->0
``````

The full code is almost identical.

`````` 1  # Perl weekly challenge 217
2  # Task 1:  Sorted Matrix
3  #
5  use v5.36;
6  use PDL;
7  use experimental "try";
8  die <<~"FIN" unless @ARGV;
9      Usage: \$0 '[[m11, m22, ...],[m21,m22,...],...]'
10      to find the third element of the sorted matrix elements mij.
11      FIN
12  for(@ARGV){
13      try {
14  	my \$x=pdl(\$_); # Convert input string to pdl-ndarray
15  	die "Expected a square matrix: \$_"
16  	    unless \$x->isa("PDL") and \$x->dims==2 and \$x->dim(0)==\$x->dim(1);
17  	my \$result=\$x
18  	    ->flat   # convert to vector
19  	    ->qsort  # sort its elements
20  	    ->at(2); # choose third smallest
21  	say "\$x->\$result";
22      }
23      catch(\$e){
24  	warn "\$e";
25      }
26  }
``````

Example:

``````./ch-1.pl 'jaja' '[[3,1,2],[5,2,4],[0,1,3]]' '[[2,1],[4,5]]' '[[1,0,3],[0,0,0],[1,2,1]]'
``````

Results:

``````[
[3 1 2]
[5 2 4]
[0 1 3]
]
->1

[
[2 1]
[4 5]
]
->4

[
[1 0 3]
[0 0 0]
[1 2 1]
]
->0
``````

``````Submitted by: Mohammad S Anwar
You are given a list of positive integers.

Write a script to concatenate the integers to form the highest possible value.

Example 1:
Input: @list = (1, 23)
Output: 231
Example 2:
Input: @list = (10, 3, 2)
Output: 3210
Example 3:
Input: @list = (31, 2, 4, 10)
Output: 431210
Example 4:
Input: @list = (5, 11, 4, 1, 2)
Output: 542111
Example 5:
Input: @list = (1, 10)
Output: 110
``````

A simple solution consists on sorting the input numbers according to their pairwise concatenation, `\$a` goes before `\$b` if the concatenation `\$a\$b` has a larger numerical value than the concatenation `\$b\$a`. This yields a short oneliner:

Example 1:

``````perl -E 'say "@ARGV -> ", join "", sort {"\$b\$a" <=> "\$a\$b"} @ARGV' 1 23
``````

Results:

``````1 23 -> 231
``````

Other examples:

``````perl -E 'say "@ARGV -> ", join "", sort {"\$b\$a" <=> "\$a\$b"} @ARGV' 10 3 2
perl -E 'say "@ARGV -> ", join "", sort {"\$b\$a" <=> "\$a\$b"} @ARGV' 31 2 4 10
perl -E 'say "@ARGV -> ", join "", sort {"\$b\$a" <=> "\$a\$b"} @ARGV' 5 11 4 1 2
perl -E 'say "@ARGV -> ", join "", sort {"\$b\$a" <=> "\$a\$b"} @ARGV' 1 10
``````

Results:

``````10 3 2 -> 3210
31 2 4 10 -> 431210
5 11 4 1 2 -> 542111
1 10 -> 110
``````

The full code is similar:

`````` 1  # Perl weekly challenge 217
2  # Task 2:  Max Number
3  #
5  use v5.36;
6  use List::Util qw(all);
7  die <<~"FIN" unless @ARGV;
8      Usage: \$0 N1 [N2...]
9      to build the highest possible number by rearranging and concatenating
10      the numbers N1 N2...
11      FIN
12  die "Expected nonnegative integers" unless all {/^\d+\$/} @ARGV;
13  say "@ARGV -> ", join "", sort {"\$b\$a" <=> "\$a\$b"} @ARGV;
``````

Examples:

``````./ch-2.pl 10 3 2
./ch-2.pl 31 2 4 10
./ch-2.pl 5 11 4 1 2
./ch-2.pl 1 10
``````

Results:

``````10 3 2 -> 3210
31 2 4 10 -> 431210
5 11 4 1 2 -> 542111
1 10 -> 110
``````
Written on May 15, 2023