diff options
| author | Mohammad Sajid Anwar <mohammad.anwar@yahoo.com> | 2025-09-15 23:35:06 +0100 |
|---|---|---|
| committer | Mohammad Sajid Anwar <mohammad.anwar@yahoo.com> | 2025-09-15 23:35:06 +0100 |
| commit | b9d3e5b99b38fbbb0ca22fad76e3f548b34f97a1 (patch) | |
| tree | a975b279b6edb1e2f37ff711e8bf71262d884b08 | |
| parent | a7e5c191eca3b507e7704fac02251b1c76601c21 (diff) | |
| download | perlweeklychallenge-club-b9d3e5b99b38fbbb0ca22fad76e3f548b34f97a1.tar.gz perlweeklychallenge-club-b9d3e5b99b38fbbb0ca22fad76e3f548b34f97a1.tar.bz2 perlweeklychallenge-club-b9d3e5b99b38fbbb0ca22fad76e3f548b34f97a1.zip | |
- Updated and improved solution.
| -rw-r--r-- | challenge-339/mohammad-anwar/perl/ch-1.pl | 52 |
1 files 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; |
