aboutsummaryrefslogtreecommitdiff
path: root/challenge-236
diff options
context:
space:
mode:
authorUtil <bruce.gray@acm.org>2023-10-01 16:44:43 -0500
committerUtil <bruce.gray@acm.org>2023-10-01 16:44:43 -0500
commit93a77546bc2e6bbc281e077cd383db5f63645895 (patch)
treee8c9e12cfb0b4de43834230a2c1f4ef8377f0948 /challenge-236
parent8da6ba32d93eaf0f48de6dade205b81e7eb44e01 (diff)
downloadperlweeklychallenge-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.raku35
-rw-r--r--challenge-236/bruce-gray/raku/ch-2.raku38
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;
+}