aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-339/wanderdoc/perl/ch-1.pl126
-rw-r--r--challenge-339/wanderdoc/perl/ch-2.pl102
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;
+}