diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2025-09-15 23:03:39 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-15 23:03:39 +0100 |
| commit | f0dfedf1e0bbae1db0035452408c7830bbbc8501 (patch) | |
| tree | c57654711f1bb73570b83123184a4b7424fbe408 | |
| parent | b2cc80b5507fc4f13b2eec8050f70ef12019ffb6 (diff) | |
| parent | 6201afbe46b4ecfd8c09fac2bde220b54b0b9ccb (diff) | |
| download | perlweeklychallenge-club-f0dfedf1e0bbae1db0035452408c7830bbbc8501.tar.gz perlweeklychallenge-club-f0dfedf1e0bbae1db0035452408c7830bbbc8501.tar.bz2 perlweeklychallenge-club-f0dfedf1e0bbae1db0035452408c7830bbbc8501.zip | |
Merge pull request #12679 from choroba/ech339
Add solutions to 339: Max Diff & Peak Point by E. Choroba
| -rwxr-xr-x | challenge-339/e-choroba/perl/ch-1.pl | 61 | ||||
| -rwxr-xr-x | challenge-339/e-choroba/perl/ch-2.pl | 21 |
2 files changed, 82 insertions, 0 deletions
diff --git a/challenge-339/e-choroba/perl/ch-1.pl b/challenge-339/e-choroba/perl/ch-1.pl new file mode 100755 index 0000000000..b649d93e38 --- /dev/null +++ b/challenge-339/e-choroba/perl/ch-1.pl @@ -0,0 +1,61 @@ +#!/usr/bin/perl +use warnings; +use strict; +use experimental qw( signatures ); + +use constant RANDOM_TESTS => 50; + +sub max_diff_nested_loops(@ints) { + my $max_diff = 0; + for my $i (0 .. $#ints) { + for my $j (0 .. $#ints) { + next if $i == $j; + + for my $k (0 .. $#ints) { + next if $i == $k || $j == $k; + + for my $l (0 .. $#ints) { + next if $i == $l || $j == $l || $k == $l; + + my $diff = $ints[$i] * $ints[$j] - $ints[$k] * $ints[$l]; + $max_diff = $diff if $diff > $max_diff; + } + } + } + } + return $max_diff +} + +sub max_diff(@ints) { + @ints = sort { $a <=> $b } @ints; + return max_diff_nested_loops(@ints) if @ints <= 8; + return max_diff_nested_loops(@ints[0 .. 3, $#ints - 3 .. $#ints]) +} + +use Test::More tests => (5 + 1) * 2 + RANDOM_TESTS + 1; + +for my $max_diff (\&max_diff_nested_loops, \&max_diff) { + 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->(20, 17, -6, -8, -8, -3, -9, -1), 337, '6 not enough'; +} + +for (1 .. RANDOM_TESTS) { + my $size = 4 + int rand 10; + my @ints = map int(rand 50) - 25, 1 .. $size; + is max_diff(@ints), max_diff_nested_loops(@ints), "same @ints"; + +} + +use Benchmark qw{ cmpthese }; + +my @ints = map int(rand 50) - 25, 1 .. 25; +is max_diff(@ints), max_diff_nested_loops(@ints), "same @ints"; + +cmpthese(-3, { + nested => sub { max_diff_nested_loops(@ints) }, + optimised => sub { max_diff(@ints) }, +}); diff --git a/challenge-339/e-choroba/perl/ch-2.pl b/challenge-339/e-choroba/perl/ch-2.pl new file mode 100755 index 0000000000..a89b957024 --- /dev/null +++ b/challenge-339/e-choroba/perl/ch-2.pl @@ -0,0 +1,21 @@ +#!/usr/bin/perl +use warnings; +use strict; +use experimental qw( signatures ); + +sub peak_point(@gain) { + my $altitude = my $peak = 0; + for my $g (@gain) { + $altitude += $g; + $peak = $altitude if $altitude > $peak; + } + return $peak +} + +use Test::More tests => 5; + +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'; |
