diff options
| -rw-r--r-- | challenge-202/wambash/raku/ch-1.raku | 30 | ||||
| -rw-r--r-- | challenge-202/wambash/raku/ch-2.raku | 48 |
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 +} |
