diff options
| author | Jan Krňávek <Jan.Krnavek@gmail.com> | 2024-01-01 00:18:16 +0100 |
|---|---|---|
| committer | Jan Krňávek <Jan.Krnavek@gmail.com> | 2024-01-01 00:18:16 +0100 |
| commit | 60e4cea94781ebeb96b0ea3bbf6dee0969f8dc5b (patch) | |
| tree | a367db9da32f019187f1b4d356242542f496f387 | |
| parent | bcc43beed33a9d6d049df72ade1bc10e2f2bb717 (diff) | |
| download | perlweeklychallenge-club-60e4cea94781ebeb96b0ea3bbf6dee0969f8dc5b.tar.gz perlweeklychallenge-club-60e4cea94781ebeb96b0ea3bbf6dee0969f8dc5b.tar.bz2 perlweeklychallenge-club-60e4cea94781ebeb96b0ea3bbf6dee0969f8dc5b.zip | |
solution week 249-2 -- gather take
| -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; } |
