aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-249/wambash/raku/ch-2.raku23
1 files changed, 19 insertions, 4 deletions
diff --git a/challenge-249/wambash/raku/ch-2.raku b/challenge-249/wambash/raku/ch-2.raku
index 3f55d70bb4..27e20c49d2 100644
--- a/challenge-249/wambash/raku/ch-2.raku
+++ b/challenge-249/wambash/raku/ch-2.raku
@@ -1,18 +1,33 @@
#!/usr/bin/env raku
+enum DI <I D>;
+
+multi DI-reducer ( @a, I, :&f=&take) {
+ f @a.head;
+ @a.skip
+}
+
+multi DI-reducer ( @a, D, :&f=&take) {
+ f @a.tail;
+ @a.head: * - 1
+}
+
sub DI-string-match ($s) {
- my @si = $s.comb;
- my @perm = 0 .. @si.elems;
+ my DI @si = |$s.comb.map( { DI::{$_} } ), I ;
- my @b = @si.map: { $_ eq 'I' ?? @perm.shift !! @perm.pop }
- |@b, @perm.shift
+ gather { reduce &DI-reducer, ^@si, |@si }
}
multi MAIN (Bool :test($)!) {
use Test;
+ is-deeply DI-reducer((0,1,2,3), I, :f(&item)), (1,2,3);
+ is-deeply DI-reducer((0,1,2,3), D, :f(&item)), (0,1,2);
+ is-deeply gather { DI-reducer((0,1,2,3), D) }, (3,);
+ is-deeply gather { DI-reducer((2,), I) }, (2,);
is-deeply DI-string-match('IDID'), (0,4,1,3,2);
is-deeply DI-string-match('III'), (0,1,2,3);
is-deeply DI-string-match('DDI'), (3,2,0,1);
+ is-deeply DI-string-match('ID' x 100).head(2), (0,200);
done-testing;
}