From b9d3e5b99b38fbbb0ca22fad76e3f548b34f97a1 Mon Sep 17 00:00:00 2001 From: Mohammad Sajid Anwar Date: Mon, 15 Sep 2025 23:35:06 +0100 Subject: - Updated and improved solution. --- challenge-339/mohammad-anwar/perl/ch-1.pl | 52 +++++++++++++------------------ 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/challenge-339/mohammad-anwar/perl/ch-1.pl b/challenge-339/mohammad-anwar/perl/ch-1.pl index 265579d0a8..c9bfb61ec3 100644 --- a/challenge-339/mohammad-anwar/perl/ch-1.pl +++ b/challenge-339/mohammad-anwar/perl/ch-1.pl @@ -6,37 +6,29 @@ use Test::More; use List::Util qw/max/; sub max_diff { - my @nums = @_; - - # For 4 elements, there are only 3 possible pairings - if (@nums == 4) { - my ($a, $b, $c, $d) = @nums; - return max( - $a*$b - $c*$d, - $a*$c - $b*$d, - $a*$d - $b*$c, - ); - } - - # For larger arrays, we need to consider extreme values - my @s = sort {$a <=> $b} @nums; - - # The maximum difference will likely come from: - # Option 1: (two largest) vs (two smallest) - # Option 2: (largest*smallest) vs (second largest*second smallest) - # Option 3: (largest*second smallest) vs (second largest*smallest) - - my $opt1 = $s[-1]*$s[-2] - $s[0]*$s[1]; - my $opt2 = $s[-1]*$s[0] - $s[-2]*$s[1]; - my $opt3 = $s[-1]*$s[1] - $s[-2]*$s[0]; - - return max($opt1, $opt2, $opt3); + my @n = @_; + my @pairs = map { + my $i = $_; + map { [$i, $_, $n[$i]*$n[$_]] } $i+1 .. $#n + } 0 .. $#n-1; + + return max + grep { defined } + map { + my ($i,$j,$p1) = @$_; + map { + my ($k,$l,$p2) = @$_; + ($i==$k||$i==$l||$j==$k||$j==$l) ? () : $p1-$p2 + } @pairs + } @pairs; } -is(max_diff(5,9,3,4,6), 42); -is(max_diff(1,-2,3,-4), 10); -is(max_diff(-3,-1,-2,-4), 10); -is(max_diff(10,2,0,5,1), 50); -is(max_diff(7,8,9,10,10), 44); +is(max_diff(5,9,3,4,6), 42); +is(max_diff(1,-2,3,-4), 10); +is(max_diff(-3,-1,-2,-4), 10); +is(max_diff(10,2,0,5,1), 50); +is(max_diff(7,8,9,10,10), 44); +is(max_diff(-1,0,1,2,3,4,5), 23); +is(max_diff(-10,0,1,2,3,4,5), 62); done_testing; -- cgit