Perl Weekly Challenge 205.
My solutions (task 1 and task 2 ) to the The Weekly Challenge - 205.
Task 1: Third Highest
Submitted by: Mohammad S Anwar
You are given an array of integers.
Write a script to find out the Third Highest if found otherwise return the maximum.
Example 1
Input: @array = (5,3,4)
Output: 3
First highest is 5. Second highest is 4. Third highest is 3.
Example 2
Input: @array = (5,6)
Output: 6
First highest is 6. Second highest is 5. Third highest is missing, so maximum
is returned.
Example 2
Input: @array = (5,4,4,3)
Output: 3
First highest is 5. Second highest is 4. Third highest is 3.
I use uniqint
from List::Util
to filter duplicates, sort the
values in descending order and choose the third value. In case there
are less than three distinct values, I copy the maximum at the end of
the list a couple of times. This yields a oneliner:
perl -MList::Util=uniqint -E '
@l=(sort {$b<=>$a} uniqint @ARGV); push @l, ($l[0])x2; say join " ", @ARGV, "->", $l[2]' 5 3 4
perl -MList::Util=uniqint -E '
@l=(sort {$b<=>$a} uniqint @ARGV); push @l, ($l[0])x2; say join " ", @ARGV, "->", $l[2]' 5 6
perl -MList::Util=uniqint -E '
@l=(sort {$b<=>$a} uniqint @ARGV); push @l, ($l[0])x2; say join " ", @ARGV, "->", $l[2]' 5 4 4 3
Results:
5 3 4 -> 3
5 6 -> 6
5 4 4 3 -> 3
Other examples:
perl -MList::Util=uniqint -E '
@l=(sort {$b<=>$a} uniqint @ARGV); push @l, ($l[0])x2; say join " ", @ARGV, "->", $l[2]' 1 2 3 4 5 6
perl -MList::Util=uniqint -E '
@l=(sort {$b<=>$a} uniqint @ARGV); push @l, ($l[0])x2; say join " ", @ARGV, "->", $l[2]' 5
perl -MList::Util=uniqint -E '
@l=(sort {$b<=>$a} uniqint @ARGV); push @l, ($l[0])x2; say join " ", @ARGV, "->", $l[2]'
Results:
1 2 3 4 5 6 -> 4
5 -> 5
->
The full code is similar, with a couple of checks added.
1 # Perl weekly challenge 205
2 # Task 1: Third Highest
3 #
4 # See https://wlmb.github.io/2023/02/20/PWC205/#task-1-third-highest
5 use v5.36;
6 use List::Util qw(uniqint);
7 die <<~"FIN" unless @ARGV;
8 Usage: $0 N1 [N2...]
9 to find the third highest number from the list N1 N2...
10 FIN
11 my @list=(sort {$b<=>$a} uniqint @ARGV); # filter out repetitions and sort descending
12 push @list, ($list[0]) x 2; # Add two copies of the maximum at the end of the list
13 say join " ", @ARGV, "->", $list[2];
Example:
./ch-1.pl 5 3 4
./ch-1.pl 5 6
./ch-1.pl 5 4 4 3
./ch-1.pl 1 2 3 4 5 6
./ch-1.pl 5
Results:
5 3 4 -> 3
5 6 -> 6
5 4 4 3 -> 3
1 2 3 4 5 6 -> 4
5 -> 5
Task 2: Maximum XOR
Submitted by: Mohammad S Anwar
You are given an array of integers.
Write a script to find the highest value obtained by XORing any two distinct members
of the array.
Example 1
Input: @array = (1,2,3,4,5,6,7)
Output: 7
The maximum result of 1 xor 6 = 7.
Example 2
Input: @array = (2,4,1,3)
Output: 7
The maximum result of 4 xor 3 = 7.
Example 3
Input: @array = (10,5,7,12,8)
Output: 7
The maximum result of 10 xor 5 = 15.
I use combinations
from Algorithm::Combinatorics
to generate all
unordered pairs of elements of the array, I xor
them and print the maximum. This yields a one liner:
perl -MAlgorithm::Combinatorics=combinations -MList::Util=max -E'
say join " ", @ARGV, "->", max map {$_->[0] ^ $_->[1]} combinations([@ARGV],2)' 1 2 3 4 5 6 7
perl -MAlgorithm::Combinatorics=combinations -MList::Util=max -E'
say join " ", @ARGV, "->", max map {$_->[0] ^ $_->[1]} combinations([@ARGV],2)' 2 4 1 3
perl -MAlgorithm::Combinatorics=combinations -MList::Util=max -E'
say join " ", @ARGV, "->", max map {$_->[0] ^ $_->[1]} combinations([@ARGV],2)' 10 5 7 12 8
Results:
1 2 3 4 5 6 7 -> 7
2 4 1 3 -> 7
10 5 7 12 8 -> 15
The full code is similar:
1 # Perl weekly challenge 205
2 # Task 2: Maximum XOR
3 #
4 # See https://wlmb.github.io/2023/02/20/PWC205/#task-2-maximum-xor
5 use v5.36;
6 use Algorithm::Combinatorics qw(combinations);
7 use List::Util qw(max);
8 die <<~"FIN" unless @ARGV >= 2;
9 Usage: $0 N1 N2 [N3...]
10 to find the maximum xor of pairs from the list N1 N2 N3...
11 FIN
12 say join " ", @ARGV, "->", max map {$_->[0] ^ $_->[1]} combinations([@ARGV],2);
I don’t have to check that the inputs differ, as n xor n = 0
.
Example:
./ch-2.pl 1 2 3 4 5 6 7
./ch-2.pl 2 4 1 3
./ch-2.pl 10 5 7 12 8
Results:
1 2 3 4 5 6 7 -> 7
2 4 1 3 -> 7
10 5 7 12 8 -> 15