From 60e4cea94781ebeb96b0ea3bbf6dee0969f8dc5b Mon Sep 17 00:00:00 2001 From: Jan Krňávek Date: Mon, 1 Jan 2024 00:18:16 +0100 Subject: solution week 249-2 -- gather take --- challenge-249/wambash/raku/ch-2.raku | 23 +++++++++++++++++++---- 1 file 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 ; + +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; } -- cgit