diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2023-02-06 01:03:35 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-06 01:03:35 +0000 |
| commit | fdd87e6dce72b008d34863f91f58fc189b6d2feb (patch) | |
| tree | 8fea93bf3b32714f31ae6f4aa012c611da5c70df /challenge-202 | |
| parent | 8937fc4249247940062dc47854453bcad8f0c27e (diff) | |
| parent | cbdf28a2af46aa374645a0b3b90a2bfb025bda2f (diff) | |
| download | perlweeklychallenge-club-fdd87e6dce72b008d34863f91f58fc189b6d2feb.tar.gz perlweeklychallenge-club-fdd87e6dce72b008d34863f91f58fc189b6d2feb.tar.bz2 perlweeklychallenge-club-fdd87e6dce72b008d34863f91f58fc189b6d2feb.zip | |
Merge pull request #7529 from adamcrussell/challenge-202
initial commit
Diffstat (limited to 'challenge-202')
| -rw-r--r-- | challenge-202/adam-russell/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-202/adam-russell/perl/ch-1.pl | 27 | ||||
| -rw-r--r-- | challenge-202/adam-russell/perl/ch-2.pl | 197 |
3 files changed, 225 insertions, 0 deletions
diff --git a/challenge-202/adam-russell/blog.txt b/challenge-202/adam-russell/blog.txt new file mode 100644 index 0000000000..09173279b4 --- /dev/null +++ b/challenge-202/adam-russell/blog.txt @@ -0,0 +1 @@ +http://www.rabbitfarm.com/cgi-bin/blosxom/perl/2023/02/05
\ No newline at end of file diff --git a/challenge-202/adam-russell/perl/ch-1.pl b/challenge-202/adam-russell/perl/ch-1.pl new file mode 100644 index 0000000000..f0e9e05b5a --- /dev/null +++ b/challenge-202/adam-russell/perl/ch-1.pl @@ -0,0 +1,27 @@ +use v5.36; +## +# You are given an array of integers. +# Write a script to print 1 if there are THREE consecutive odds +# in the given array otherwise print 0. +## +use boolean; + +sub three_consecutive_odds{ + my @numbers = @_; + my $consecutive_odds = 0; + { + my $x = pop @numbers; + $consecutive_odds++ if 1 == ($x & 1); + $consecutive_odds = 0 if 0 == ($x & 1); + return true if 3 == $consecutive_odds; + redo if @numbers; + } + return false; +} + +MAIN:{ + say three_consecutive_odds(1, 5, 3, 6); + say three_consecutive_odds(2, 6, 3, 5); + say three_consecutive_odds(1, 2, 3, 4); + say three_consecutive_odds(2, 3, 5, 7); +}
\ No newline at end of file diff --git a/challenge-202/adam-russell/perl/ch-2.pl b/challenge-202/adam-russell/perl/ch-2.pl new file mode 100644 index 0000000000..72bb1186f3 --- /dev/null +++ b/challenge-202/adam-russell/perl/ch-2.pl @@ -0,0 +1,197 @@ +use v5.36; +## +# Given a profile as a list of altitudes, return the leftmost widest valley. +# A valley is defined as a subarray of the profile consisting of two +# parts: the first part is non-increasing and the second part is non-decreasing. +# Either part can be empty. +## +use boolean; +use FSA::Rules; + +sub widest_valley_rules{ + my @altitudes = @_; + my @downslope; + my @upslope; + my $fsa = FSA::Rules->new( + move => { + do => sub{ my $state = shift; + $state->machine->{altitude} = [] if(!$state->machine->{altitude}); + $state->machine->{plateau} = [] if(!$state->machine->{plateau}); + $state->machine->{downslope} = [] if(!$state->machine->{downslope}); + $state->machine->{upslope} = [] if(!$state->machine->{upslope}); + my $previous_altitudes = $state->machine->{altitude}; + my $current_altitude = shift @altitudes; + push @{$previous_altitudes}, $current_altitude + }, + rules => [ done => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + !defined($previous_altitudes->[@{$previous_altitudes} - 1]) + }, + move => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + @{$previous_altitudes} == 1; + }, + plateau => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if(@{$previous_altitudes} == 2){ + if($previous_altitudes->[@{$previous_altitudes} - 1] == $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{plateau}}, $previous_altitudes->[@{$previous_altitudes} - 2], $previous_altitudes->[@{$previous_altitudes} - 1]; + } + } + }, + plateau => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if(@{$previous_altitudes} > 2){ + if($previous_altitudes->[@{$previous_altitudes} - 1] == $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{plateau}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + } + } + }, + downslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if(@{$previous_altitudes} == 2){ + if($previous_altitudes->[@{$previous_altitudes} - 1] < $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{downslope}}, $previous_altitudes->[@{$previous_altitudes} - 2], $previous_altitudes->[@{$previous_altitudes} - 1]; + } + } + }, + downslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if(@{$previous_altitudes} > 2){ + if($previous_altitudes->[@{$previous_altitudes} - 1] < $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{downslope}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + }else{false} + } + }, + upslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if(@{$previous_altitudes} == 2){ + if($previous_altitudes->[@{$previous_altitudes} - 1] > $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{upslope}}, $previous_altitudes->[@{$previous_altitudes} - 2], $previous_altitudes->[@{$previous_altitudes} - 1]; + } + } + }, + upslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if(@{$previous_altitudes} > 2){ + if($previous_altitudes->[@{$previous_altitudes} - 1] > $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{upslope}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + } + } + }, + ], + }, + plateau => { + do => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + my $current_altitude = shift @altitudes; + push @{$previous_altitudes}, $current_altitude; + }, + rules => [ done => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + !defined($previous_altitudes->[@{$previous_altitudes} - 1]) + }, + plateau => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if($previous_altitudes->[@{$previous_altitudes} - 1] == $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{plateau}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + } + }, + downslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if($previous_altitudes->[@{$previous_altitudes} - 1] < $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{downslope}}, @{$state->machine->{plateau}}; + push @{$state->machine->{downslope}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + $state->machine->{plateau} = []; + } + }, + upslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if($previous_altitudes->[@{$previous_altitudes} - 1] > $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{upslope}}, @{$state->machine->{plateau}}; + push @{$state->machine->{upslope}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + $state->machine->{plateau} = []; + } + } + ], + }, + downslope => { + do => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + my $current_altitude = shift @altitudes; + push @{$previous_altitudes}, $current_altitude; + }, + rules => [ done => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + !defined($previous_altitudes->[@{$previous_altitudes} - 1]) + }, + plateau => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if($previous_altitudes->[@{$previous_altitudes} - 1] == $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{plateau}}, $previous_altitudes->[@{$previous_altitudes} - 2], $previous_altitudes->[@{$previous_altitudes} - 1]; + #pop @{$state->machine->{downslope}};true; + } + }, + downslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if($previous_altitudes->[@{$previous_altitudes} - 1] < $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{downslope}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + } + }, + upslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if($previous_altitudes->[@{$previous_altitudes} - 1] > $previous_altitudes->[@{$previous_altitudes} - 2]){ + $state->machine->{upslope} = []; + push @{$state->machine->{upslope}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + } + }, + ], + }, + upslope => { + do => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + my $current_altitude = shift @altitudes; + push @{$previous_altitudes}, $current_altitude; + }, + rules => [ done => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + !defined($previous_altitudes->[@{$previous_altitudes} - 1]) + }, + done => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + $previous_altitudes->[@{$previous_altitudes} - 1] < $previous_altitudes->[@{$previous_altitudes} - 2]; + }, + plateau => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if($previous_altitudes->[@{$previous_altitudes} - 1] == $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{plateau}}, $previous_altitudes->[@{$previous_altitudes} - 2], $previous_altitudes->[@{$previous_altitudes} - 1]; + } + }, + upslope => sub{ my $state = shift; + my $previous_altitudes = $state->machine->{altitude}; + if($previous_altitudes->[@{$previous_altitudes} - 1] > $previous_altitudes->[@{$previous_altitudes} - 2]){ + push @{$state->machine->{upslope}}, $previous_altitudes->[@{$previous_altitudes} - 1]; + } + } + ], + }, + done => { + do => sub { my $state = shift; + say q/Valley: / . join(q/, /, @{$state->machine->{downslope}}, @{$state->machine->{upslope}}); + } + }, + ); + return $fsa; +} + +sub widest_valley{ + my $rules = widest_valley_rules(@_); + $rules->start; + $rules->switch until $rules->at(q/done/); +} + +MAIN:{ + widest_valley 1, 5, 5, 2, 8; + widest_valley 2, 6, 8, 5; + widest_valley 2, 1, 2, 1, 3; +}
\ No newline at end of file |
