aboutsummaryrefslogtreecommitdiff
path: root/challenge-202
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2023-02-06 01:03:35 +0000
committerGitHub <noreply@github.com>2023-02-06 01:03:35 +0000
commitfdd87e6dce72b008d34863f91f58fc189b6d2feb (patch)
tree8fea93bf3b32714f31ae6f4aa012c611da5c70df /challenge-202
parent8937fc4249247940062dc47854453bcad8f0c27e (diff)
parentcbdf28a2af46aa374645a0b3b90a2bfb025bda2f (diff)
downloadperlweeklychallenge-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.txt1
-rw-r--r--challenge-202/adam-russell/perl/ch-1.pl27
-rw-r--r--challenge-202/adam-russell/perl/ch-2.pl197
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