aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Anderson <mark@andemark.io>2025-09-15 22:18:01 +0000
committerMark Anderson <mark@andemark.io>2025-09-15 22:18:01 +0000
commitecd506a806197303aa794ba0385f9223f1ce121c (patch)
tree7bbca8c5c9cc7dcbfe7c46a818aace6766c16ac2
parentb2cc80b5507fc4f13b2eec8050f70ef12019ffb6 (diff)
downloadperlweeklychallenge-club-ecd506a806197303aa794ba0385f9223f1ce121c.tar.gz
perlweeklychallenge-club-ecd506a806197303aa794ba0385f9223f1ce121c.tar.bz2
perlweeklychallenge-club-ecd506a806197303aa794ba0385f9223f1ce121c.zip
Challenge 339 Solutions (Raku)
-rw-r--r--challenge-339/mark-anderson/raku/ch-1.raku65
-rw-r--r--challenge-339/mark-anderson/raku/ch-2.raku13
2 files changed, 78 insertions, 0 deletions
diff --git a/challenge-339/mark-anderson/raku/ch-1.raku b/challenge-339/mark-anderson/raku/ch-1.raku
new file mode 100644
index 0000000000..89d5b34d16
--- /dev/null
+++ b/challenge-339/mark-anderson/raku/ch-1.raku
@@ -0,0 +1,65 @@
+#!/usr/bin/env raku
+use Test;
+
+is max-diff(< 5 9 3 4 6 >), 42;
+is max-diff(< 1 -2 3 -4 >), 10;
+is max-diff(< -3 -1 -2 -4 >), 10;
+is max-diff(< 10 2 0 5 1 >), 50;
+is max-diff(< 7 8 9 10 10 >), 44;
+
+sub max-diff(@a)
+{
+ my %c := { -1 => [], 0 => [], 1 => [] }
+ @a.classify(*.sign, :into(%c));
+ %c<-1> = %c<-1>.sort.Array;
+ %c<1> = %c<1> .sort.Array;
+
+ if %c<0> >= @a.end { return 0 }
+ if none(%c<-1 0>) { return ([*] %c<1> .tail(2)) - ([*] %c<1> .head(2)) }
+ if none(%c<1 0>) { return ([*] %c<-1>.head(2)) - ([*] %c<-1>.tail(2)) }
+
+ return .max given gather
+ {
+ if all(%c<1> >= 3, %c<-1> >= 1)
+ {
+ take ([*] %c<1>[*-2,*-1]) - ([*] %c<-1>[0], %c<1>[*-3]);
+ take ([*] %c<1>[*-3,*-2]) - ([*] %c<-1>[0], %c<1>[*-1])
+ }
+
+ if all(%c<-1> >= 3, %c<1> >= 1)
+ {
+ take ([*] %c<-1>[0,1]) - ([*] %c<-1>[2], %c<1>[*-1]);
+ take ([*] %c<-1>[1,2]) - ([*] %c<-1>[0], %c<1>[*-1])
+ }
+
+ if all(all(%c<-1 1>) >= 2, none(%c<0>))
+ {
+ take (%c<-1>.tail * %c<1>.head) - (%c<-1>.head * %c<1>.tail)
+ }
+
+ if all(%c<-1 0 1>) >= 1
+ {
+ take -([*] %c<-1>.head, %c<1>.tail)
+ }
+
+ if all(%c<1> >= 2, %c<0> >= 1)
+ {
+ take [*] %c<1>.tail(2)
+ }
+
+ if all(%c<-1> >= 2, %c<0> >= 1)
+ {
+ take [*] %c<-1>.head(2)
+ }
+
+ if %c<-1> == 2
+ {
+ take ([*] %c<-1>.head(2)) - ([*] %c<1>.head(2))
+ }
+
+ if %c<1> == 2
+ {
+ take ([*] %c<1>.tail(2)) - ([*] %c<-1>.tail(2))
+ }
+ }
+}
diff --git a/challenge-339/mark-anderson/raku/ch-2.raku b/challenge-339/mark-anderson/raku/ch-2.raku
new file mode 100644
index 0000000000..4cfc4d54e6
--- /dev/null
+++ b/challenge-339/mark-anderson/raku/ch-2.raku
@@ -0,0 +1,13 @@
+#!/usr/bin/env raku
+use Test;
+
+is peak-point(< -5 1 5 -9 2 >), 1;
+is peak-point(< 10 10 10 -25 >), 30;
+is peak-point(< 3 -4 2 5 -6 1 >), 6;
+is peak-point(< -1 -2 -3 -4 >), 0;
+is peak-point(< -10 15 5 >), 10;
+
+sub peak-point(+@gain)
+{
+ max [\+] 0, |@gain
+}