diff options
| -rw-r--r-- | challenge-339/wanderdoc/perl/ch-1.pl | 126 | ||||
| -rw-r--r-- | challenge-339/wanderdoc/perl/ch-2.pl | 102 |
2 files changed, 228 insertions, 0 deletions
diff --git a/challenge-339/wanderdoc/perl/ch-1.pl b/challenge-339/wanderdoc/perl/ch-1.pl new file mode 100644 index 0000000000..ef2d969812 --- /dev/null +++ b/challenge-339/wanderdoc/perl/ch-1.pl @@ -0,0 +1,126 @@ +#!perl +use strict; +use warnings FATAL => qw(all); + +=prompt +You are given an array of integers having four or more elements. + +Write a script to find two pairs of numbers from this list (four numbers total) so that the difference between their products is as large as possible. + +In the end return the max difference. + + With Two pairs (a, b) and (c, d), the product difference is (a * b) - (c * d). + + +Example 1 + +Input: @ints = (5, 9, 3, 4, 6) +Output: 42 + +Pair 1: (9, 6) +Pair 2: (3, 4) +Product Diff: (9 * 6) - (3 * 4) => 54 - 12 => 42 + + +Example 2 + +Input: @ints = (1, -2, 3, -4) +Output: 10 + +Pair 1: (1, -2) +Pair 2: (3, -4) + + +Example 3 + +Input: @ints = (-3, -1, -2, -4) +Output: 10 + +Pair 1: (-1, -2) +Pair 2: (-3, -4) + + +Example 4 + +Input: @ints = (10, 2, 0, 5, 1) +Output: 50 + +Pair 1: (10, 5) +Pair 2: (0, 1) + + +Example 5 + +Input: @ints = (7, 8, 9, 10, 10) +Output: 44 + +Pair 1: (10, 10) +Pair 2: (7, 8) + +=cut + +use List::Util qw(all); # max product); + +use Test2::V0 -no_srand => 1; + + + +is(max_diff(5, 9, 3, 4, 6), 42, 'Example 1'); +is(max_diff(1, -2, 3, -4), 10, 'Example 2'); +is(max_diff(-3, -1, -2, -4), 10, 'Example 3'); +is(max_diff(10, 2, 0, 5, 1), 50, 'Example 4'); +is(max_diff(7, 8, 9, 10, 10), 44, 'Example 5'); +is(max_diff(-5, 1, 2, 3, 5), 31, 'Example 6a'); +is(max_diff(-5, -1, 2, 3, 5), 31, 'Example 7a'); +done_testing(); + + +sub max_diff +{ + my @arr = @_; + if ( (all {$_ >= 0} @arr) or (all { $_ < 0 } @arr) ) + { + @arr = sort {$a <=> $b} @arr; + if ( all {$_ >= 0} @arr ) + { + return product(@arr[$#arr-1, $#arr]) - + product(@arr[0, 1]); + } + else # i.e. < 0 + { + return product(@arr[0, 1]) - + product(@arr[$#arr-1, $#arr]); + } + } + else + { + my $max = (~0+1)*-1; + for my $i ( @arr ) + { + for my $j ( @arr ) + { + next if $i == $j; + for my $k ( @arr ) + { + next if ($k == $j or $k == $i); + for my $m ( @arr ) + { + next if ($m == $k or $m == $j or $m == $i); + my $first = product($i, $j); + my $second = product($k, $m); + $max = ($first - $second) > $max ? + ($first - $second) : $max; + } + } + } + } + return $max; + } + + +} + +sub product +{ + return $_[0] * $_[1]; +} diff --git a/challenge-339/wanderdoc/perl/ch-2.pl b/challenge-339/wanderdoc/perl/ch-2.pl new file mode 100644 index 0000000000..01d1c86d2b --- /dev/null +++ b/challenge-339/wanderdoc/perl/ch-2.pl @@ -0,0 +1,102 @@ +#!perl +use strict; +use warnings FATAL => qw(all); + +=prompt +You are given an array of altitude gain. +Write a script to find the peak point gained. + +Example 1 + +Input: @gain = (-5, 1, 5, -9, 2) +Output: 1 + +start: 0 +1st change: 0 + (-5) = -5 +2nd change: -5 + 1 = -4 +3rd change: -4 + 5 = 1 +4th change: 1 + (-9) = -8 +5th change: -8 + 2 = -6 + +max(0, -5, -4, 1, -8, -6) = 1 + + +Example 2 + +Input: @gain = (10, 10, 10, -25) +Output: 30 + +start: 0 +1st change: 0 + 10 = 10 +2nd change: 10 + 10 = 20 +3rd change: 20 + 10 = 30 +4th change: 30 + (-25) = 5 + +max(0, 10, 20, 30, 5) = 30 + + +Example 3 + +Input: @gain = (3, -4, 2, 5, -6, 1) +Output: 6 + +start: 0 +1st change: 0 + 3 = 3 +2nd change: 3 + (-4) = -1 +3rd change: -1 + 2 = 1 +4th change: 1 + 5 = 6 +5th change: 6 + (-6) = 0 +6th change: 0 + 1 = 1 + +max(0, 3, -1, 1, 6, 0, 1) = 6 + + +Example 4 + +Input: @gain = (-1, -2, -3, -4) +Output: 0 + +start: 0 +1st change: 0 + (-1) = -1 +2nd change: -1 + (-2) = -3 +3rd change: -3 + (-3) = -6 +4th change: -6 + (-4) = -10 + +max(0, -1, -3, -6, -10) = 0 + + +Example 5 + +Input: @gain = (-10, 15, 5) +Output: 10 + +start: 0 +1st change: 0 + (-10) = -10 +2nd change: -10 + 15 = 5 +3rd change: 5 + 5 = 10 + +max(0, -10, 5, 10) = 10 + +=cut + +use Test2::V0 -no_srand => 1; + +is(peak_point(-5, 1, 5, -9, 2), 1, 'Example 1'); +is(peak_point(10, 10, 10, -25), 30, 'Example 2'); +is(peak_point(3, -4, 2, 5, -6, 1), 6, 'Example 3'); +is(peak_point(-1, -2, -3, -4), 0, 'Example 4'); +is(peak_point(-10, 15, 5), 10, 'Example 5'); +done_testing(); + +sub peak_point +{ + my @arr = @_; + my $sum; + my $max = 0; + for my $elm ( @arr ) + { + $sum += $elm; + $max = $max > $sum ? $max : $sum; + } + return $max; +} |
