aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-202/wambash/raku/ch-1.raku30
-rw-r--r--challenge-202/wambash/raku/ch-2.raku48
2 files changed, 78 insertions, 0 deletions
diff --git a/challenge-202/wambash/raku/ch-1.raku b/challenge-202/wambash/raku/ch-1.raku
new file mode 100644
index 0000000000..c77fd2e494
--- /dev/null
+++ b/challenge-202/wambash/raku/ch-1.raku
@@ -0,0 +1,30 @@
+#!/usr/bin/env raku
+
+sub consecutive-odds-producer ( Capture (:$acc, :result($)), $element ) {
+ $element %% 2
+ ?? \( :acc(Empty), :result($acc) )
+ !! \( :acc(|$acc,$element), :result(Empty) )
+}
+
+sub consecutive-odds (+@list) {
+ \(acc => Empty, result => Empty), |@list, 0
+ andthen .produce: &consecutive-odds-producer
+ andthen .map: *<result>
+ andthen .first: *.elems ≥ 3
+}
+
+multi MAIN (Bool :test($)!) {
+ use Test;
+ is-deeply consecutive-odds-producer( \(:acc(1,3),:result(1,1,3) ), 3 ), \( :acc(1,3,3), :result(Empty) );
+ is-deeply consecutive-odds-producer( \(:acc(1,3),:result(Empty) ), 4 ), \( :acc(Empty), :result(1,3 ) );
+ is consecutive-odds(1,5,3,6), (1,5,3);
+ is consecutive-odds(1,2,3,4), Nil;
+ is consecutive-odds(2,6,3,5), Nil;
+ is consecutive-odds(2,3,5,7), (3,5,7);
+ is consecutive-odds(1,5,4,5,1,3,2,2,2,3,1,2,1,3), (5,1,3);
+ done-testing;
+}
+
+multi MAIN (+@list) {
+ say +so consecutive-odds @list
+}
diff --git a/challenge-202/wambash/raku/ch-2.raku b/challenge-202/wambash/raku/ch-2.raku
new file mode 100644
index 0000000000..facedf6eb7
--- /dev/null
+++ b/challenge-202/wambash/raku/ch-2.raku
@@ -0,0 +1,48 @@
+#!/usr/bin/env raku
+
+sub tail-same (+@list) {
+ my @rev-list = @list.reverse;
+ @rev-list.toggle: * == @rev-list[0]
+}
+
+sub valley-producer (Capture ($direct, :@acc, :valley($)), $element ) {
+ my $new-direct := @acc.tail <=> $element || $direct;
+
+ $direct < $new-direct
+ ?? \( More, :acc(|tail-same(@acc),$element),:valley(@acc))
+ !! \( $new-direct, :acc(|@acc,$element), :valley(Empty) )
+}
+
+
+
+sub valleys (+@list) {
+ |@list, -∞
+ andthen \(Less,:acc(.head,),:valley(Empty)), |.skip
+ andthen .produce: &valley-producer
+ andthen .map: *<valley>
+}
+
+sub widest-valley (+@list) {
+ valleys @list
+ andthen .max: *.elems
+}
+
+multi MAIN (Bool :test($)!) {
+ use Test;
+ is tail-same(1,3,3,1), 1;
+ is tail-same(1,3,3,3),(3,3,3);
+ is-deeply valley-producer(\(Less,:acc(2,1,3,)),1), \(More, :acc(3,1),:valley(2,1,3));
+ is-deeply valley-producer(\(Less,:acc(2,1,3,)),4), \(Less, :acc(2,1,3,4),:valley(Empty));
+ is-deeply valley-producer(\(Less,:acc(1,2,3,3)),1), \(More, :acc(3,3,1),:valley(1,2,3,3));
+ is-deeply valleys(1, 5, 5, 2, 8, 1, 3, 2,2, 6, 1), ((1,5,5),(5,5,2,8),(8,1,3),(3,2,2,6));
+ is-deeply widest-valley(1, 5, 5, 2, 8), (5,5,2,8);
+ is widest-valley(2, 6, 8, 5), (2,6,8);
+ is widest-valley(9, 8, 13, 13, 2, 2, 15, 17), (13,13,2,2,15,17);
+ is widest-valley(2, 1, 2, 1, 3), (2,1,2);
+ is widest-valley(1, 3, 3, 2, 1, 2, 3, 3, 2), (3,3,2,1,2,3,3);
+ done-testing;
+}
+
+multi MAIN (*@list) {
+ put widest-valley @list
+}