diff options
| author | Mark Anderson <mark@andemark.io> | 2025-09-15 22:18:01 +0000 |
|---|---|---|
| committer | Mark Anderson <mark@andemark.io> | 2025-09-15 22:18:01 +0000 |
| commit | ecd506a806197303aa794ba0385f9223f1ce121c (patch) | |
| tree | 7bbca8c5c9cc7dcbfe7c46a818aace6766c16ac2 | |
| parent | b2cc80b5507fc4f13b2eec8050f70ef12019ffb6 (diff) | |
| download | perlweeklychallenge-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.raku | 65 | ||||
| -rw-r--r-- | challenge-339/mark-anderson/raku/ch-2.raku | 13 |
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 +} |
