diff options
| author | James Smith <js5@sanger.ac.uk> | 2023-02-01 07:15:00 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-01 07:15:00 +0000 |
| commit | 57329639fdefe2cc21510b636cdf9d89e1dd450f (patch) | |
| tree | 05949945b2aff6265c5f542557eac57cfa0d86c6 /challenge-202 | |
| parent | 7b5970ded1466f0d928d45298793762a140b5775 (diff) | |
| download | perlweeklychallenge-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.pl | 23 |
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... +} + |
