diff options
| -rw-r--r-- | challenge-249/wambash/raku/ch-2.raku | 23 |
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; } |
