aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark <53903062+andemark@users.noreply.github.com>2023-05-31 06:46:32 +0000
committerMark <53903062+andemark@users.noreply.github.com>2023-05-31 06:46:32 +0000
commitb57d129e633f54d457ad5becca40be457c3ab49a (patch)
treebc4d03753816888f397531bf69ade41351cc0a9a
parenta44bd8ba4999bfbf35e643397939100a8105d3bb (diff)
downloadperlweeklychallenge-club-b57d129e633f54d457ad5becca40be457c3ab49a.tar.gz
perlweeklychallenge-club-b57d129e633f54d457ad5becca40be457c3ab49a.tar.bz2
perlweeklychallenge-club-b57d129e633f54d457ad5becca40be457c3ab49a.zip
Initial 219 (Raku)
-rw-r--r--challenge-219/mark-anderson/raku/ch-1.raku10
-rw-r--r--challenge-219/mark-anderson/raku/ch-2.raku51
2 files changed, 61 insertions, 0 deletions
diff --git a/challenge-219/mark-anderson/raku/ch-1.raku b/challenge-219/mark-anderson/raku/ch-1.raku
new file mode 100644
index 0000000000..b6bf41ca47
--- /dev/null
+++ b/challenge-219/mark-anderson/raku/ch-1.raku
@@ -0,0 +1,10 @@
+#!/usr/bin/env raku
+use Test;
+
+is sorted-squares(-2,-1,0,3,4), (0,1,4,9,16);
+is sorted-squares(5,-4,-1,3,6), (1,9,16,25,36);
+
+sub sorted-squares(+$a)
+{
+ sort $a >>**>> 2
+}
diff --git a/challenge-219/mark-anderson/raku/ch-2.raku b/challenge-219/mark-anderson/raku/ch-2.raku
new file mode 100644
index 0000000000..c59f4dcbce
--- /dev/null
+++ b/challenge-219/mark-anderson/raku/ch-2.raku
@@ -0,0 +1,51 @@
+#!/usr/bin/env raku
+use Test;
+
+is travel-expenditure(1,5,6,7,9,15), 11;
+is travel-expenditure(1,2,3,5,7,10,11,12,14,20,30,31), 20;
+is travel-expenditure(1..2500), 2088;
+is travel-expenditure(1..2520), 2100;
+is travel-expenditure(1..2525), 2107;
+is travel-expenditure(1..2528), 2109;
+
+# Not the most elegant solution but it's pretty fast.
+
+sub travel-expenditure(+@days)
+{
+ my $cost;
+ my %cost := { 1 => 2, 7 => 7, 30 => 25 }
+ my %min-span := { 1 => 1, 7 => 4, 30 => 23 }
+
+ for (30,7,1) -> $n
+ {
+ loop
+ {
+ last unless @days;
+ my %days = @days.antipairs;
+ my @mm = @days.minmax.rotor($n => $n-1);
+
+ unless @mm
+ {
+ delete-days(@days) if @days.minmax >= %min-span{$n};
+ last
+ }
+
+ my @ints = do ($_ (&) @days).keys for @mm;
+
+ my %c = @ints.classify({ .elems });
+
+ last unless %c.max.key >= %min-span{$n};
+
+ delete-days(%c.max.value.head);
+
+ sub delete-days(@a)
+ {
+ %days{@a}:delete;
+ @days = %days.keys>>.Int;
+ $cost += %cost{$n};
+ }
+ }
+ }
+
+ $cost
+}