aboutsummaryrefslogtreecommitdiff
path: root/challenge-202
diff options
context:
space:
mode:
authorJames Smith <js5@sanger.ac.uk>2023-02-01 07:15:00 +0000
committerGitHub <noreply@github.com>2023-02-01 07:15:00 +0000
commit57329639fdefe2cc21510b636cdf9d89e1dd450f (patch)
tree05949945b2aff6265c5f542557eac57cfa0d86c6 /challenge-202
parent7b5970ded1466f0d928d45298793762a140b5775 (diff)
downloadperlweeklychallenge-club-57329639fdefe2cc21510b636cdf9d89e1dd450f.tar.gz
perlweeklychallenge-club-57329639fdefe2cc21510b636cdf9d89e1dd450f.tar.bz2
perlweeklychallenge-club-57329639fdefe2cc21510b636cdf9d89e1dd450f.zip
Update ch-2.pl
Diffstat (limited to 'challenge-202')
-rw-r--r--challenge-202/james-smith/perl/ch-2.pl23
1 files changed, 22 insertions, 1 deletions
diff --git a/challenge-202/james-smith/perl/ch-2.pl b/challenge-202/james-smith/perl/ch-2.pl
index 329d09863b..aaa162389c 100644
--- a/challenge-202/james-smith/perl/ch-2.pl
+++ b/challenge-202/james-smith/perl/ch-2.pl
@@ -13,10 +13,19 @@ my @TESTS = (
[ [2,1,2,1,3], '2 1 2'], # -1 1 -1 1
[ [1,3,3,2,1,2,3,3,2],'3 3 2 1 2 3 3' ], # 1 0 -1 -1 1 1 0 -1
[ [2,3,2,1], '3 2 1' ], # 1 -1 -1
+ [ [(1) x 20,1..50,(50) x 20,reverse(1..50),(1)x 20,1..50,reverse(1..50),(1) x 10,1..50,(50)x 10],
+ '50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 50']
);
-is( "@{[ valley( @{$_->[0]} ) ]}", $_->[1] ) for @TESTS2;
+is( "@{[ valley( @{$_->[0]} ) ]}", $_->[1] ) for @TESTS2;
+is( "@{[ valley2( @{$_->[0]} ) ]}", $_->[1] ) for @TESTS2;
done_testing();
+cmpthese( -2, {
+ 1 => sub { valley( @{$_->[0]} ) for @TESTS2 },
+ 2 => sub { valley2( @{$_->[0]} ) for @TESTS2 },
+});
+
+
sub valley {
my( $L, $R, @d )=( 0, 0, slide { $b <=> $a } @_ );
for my $l ( 0 .. $#d-1) {
@@ -28,3 +37,15 @@ sub valley {
}
@_[$L..$R];
}
+
+sub valley2 {
+ my( $pd, $s, $s2, $S, $E, $d ) = ( 0, 0, 0, 0, 0 );
+ for( 1 .. $#_ ) {
+ $d = $_[$_]-$_[$_-1];
+ $s2 = $_-1 if $pd > 0 && $d <= 0; ## Start of plateau
+ ( $_-$s > $E-$S ) && ( ( $S, $E, $s ) = ( $s, $_, $s2 ) ) if $d < 0 && $pd >= 0; ## End of plateau
+ $pd = $d
+ }
+ @_-$s2 > $E-$S ? @_[ $s2 .. $#_ ] : @_[ $S .. $E-1 ] ## Check the last valley...
+}
+