From 93a77546bc2e6bbc281e077cd383db5f63645895 Mon Sep 17 00:00:00 2001 From: Util Date: Sun, 1 Oct 2023 16:44:43 -0500 Subject: Add TWC 236 solutions by Bruce Gray (Raku only). --- challenge-236/bruce-gray/raku/ch-1.raku | 35 ++++++++++++++++++++++++++++++ challenge-236/bruce-gray/raku/ch-2.raku | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 challenge-236/bruce-gray/raku/ch-1.raku create mode 100644 challenge-236/bruce-gray/raku/ch-2.raku (limited to 'challenge-236') diff --git a/challenge-236/bruce-gray/raku/ch-1.raku b/challenge-236/bruce-gray/raku/ch-1.raku new file mode 100644 index 0000000000..1fc95c3ef3 --- /dev/null +++ b/challenge-236/bruce-gray/raku/ch-1.raku @@ -0,0 +1,35 @@ +sub make_change ( BagHash $bankroll is rw, $change_owed is copy --> Bool ) { + + for $bankroll.keys.sort.reverse -> $bill { + + while $bankroll{$bill} and $change_owed >= $bill { + $bankroll{$bill} -= 1; + $change_owed -= $bill; + } + } + + return $change_owed == 0; +} + +sub task1 ( @ns --> Bool ) { + constant $juice_cost = 5; + + my BagHash $carny_roll; + for @ns -> $bill { + $carny_roll{$bill}++; + make_change( $carny_roll, $bill - $juice_cost ) + or return False; + } + return True; +} + + +my @tests = + ( True , ( 5, 5, 5, 10, 20 ) ), + ( False , ( 5, 5, 10, 10, 20 ) ), + ( True , ( 5, 5, 5, 20 ) ), +; +use Test; plan +@tests; +for @tests -> ( Bool $expected, @in ) { + is task1(@in), $expected; +} diff --git a/challenge-236/bruce-gray/raku/ch-2.raku b/challenge-236/bruce-gray/raku/ch-2.raku new file mode 100644 index 0000000000..273a0f89dd --- /dev/null +++ b/challenge-236/bruce-gray/raku/ch-2.raku @@ -0,0 +1,38 @@ +sub find_loops ( @ns --> Seq ) { + my @n = @ns; + + return gather loop { + my $start = @n.first( :k, *.defined ) + orelse last; + + my @chain = @n[$start]:delete, { @n[$^prior]:delete } …^ { $^prior.defined.not }; + + take @chain if $start == @chain.tail; + } +} + +sub task2 ( @ns --> UInt ) { + my @loops = find_loops(@ns); + + # say @loops; + return elems @loops; +} + + +my @tests = + ( 3, (4,6,3,8,15,0,13,18,7,16,14,19,17,5,11,1,12,2,9,10) ), + ( 6, (0,1,13,7,6,8,10,11,2,14,16,4,12,9,17,5,3,18,15,19) ), + ( 1, (9,8,3,11,5,7,13,19,12,4,14,10,18,2,16,1,0,15,6,17) ), + + ( 3, (1,0,3,2,6,4,5) ), + ( 1, (1,0) ), + ( 1, (0,) ), + ( 1, (0,0) ), + ( 1, (0,0,0) ), + ( 4, (0,1,2,3) ), + ( 0, (99,) ), +; +use Test; plan +@tests; +for @tests -> ( UInt $expected, @in ) { + is task2( @in), $expected; +} -- cgit