diff options
| author | Util <bruce.gray@acm.org> | 2023-10-01 16:44:43 -0500 |
|---|---|---|
| committer | Util <bruce.gray@acm.org> | 2023-10-01 16:44:43 -0500 |
| commit | 93a77546bc2e6bbc281e077cd383db5f63645895 (patch) | |
| tree | e8c9e12cfb0b4de43834230a2c1f4ef8377f0948 /challenge-236 | |
| parent | 8da6ba32d93eaf0f48de6dade205b81e7eb44e01 (diff) | |
| download | perlweeklychallenge-club-93a77546bc2e6bbc281e077cd383db5f63645895.tar.gz perlweeklychallenge-club-93a77546bc2e6bbc281e077cd383db5f63645895.tar.bz2 perlweeklychallenge-club-93a77546bc2e6bbc281e077cd383db5f63645895.zip | |
Add TWC 236 solutions by Bruce Gray (Raku only).
Diffstat (limited to 'challenge-236')
| -rw-r--r-- | challenge-236/bruce-gray/raku/ch-1.raku | 35 | ||||
| -rw-r--r-- | challenge-236/bruce-gray/raku/ch-2.raku | 38 |
2 files changed, 73 insertions, 0 deletions
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; +} |
