aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-339/simon-proctor/raku/ch-1.raku42
-rwxr-xr-xchallenge-339/simon-proctor/raku/ch-2.raku21
2 files changed, 63 insertions, 0 deletions
diff --git a/challenge-339/simon-proctor/raku/ch-1.raku b/challenge-339/simon-proctor/raku/ch-1.raku
new file mode 100755
index 0000000000..75c843cfde
--- /dev/null
+++ b/challenge-339/simon-proctor/raku/ch-1.raku
@@ -0,0 +1,42 @@
+#!/usr/bin/env raku
+
+subset IsTrue of Bool where so *;
+
+multi sub MAIN( IsTrue :t(:$test) ) is hidden-from-USAGE {
+ 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;
+ is max-diff(1,-2,3,4), 14;
+ is max-diff(1,2,3,4,5,6,-10),80;
+ done-testing;
+}
+
+multi sub MAIN( *@ints where Int() ~~ all(*) ) {
+ max-diff( |@ints ).say;
+}
+
+multi sub max-diff( *@ints where all(@ints) >= 0 ) {
+ my @sorted = @ints.sort;
+ return (([*] @sorted.tail(2)) - ([*] @sorted.head(2)) );
+}
+
+multi sub max-diff( *@ints where all(@ints) <= 0 ) {
+ my @sorted = @ints.sort;
+ return (([*] @sorted.head(2)) - ([*] @sorted.tail(2)) );
+}
+
+multi sub max-diff( *@ints where *.elems > 4 ) {
+ @ints.combinations(4).map( -> @l { max-diff(|@l) } ).max;
+}
+
+multi sub max-diff( Int $a, Int $b, Int $c, Int $d ) {
+ ( ( ($a*$b)-($c*$d) ),
+ ( ($c*$d)-($a*$b) ),
+ ( ($a*$c)-($b*$d) ),
+ ( ($b*$d)-($a*$c) ),
+ ( ($a*$d)-($b*$c) ),
+ ( ($b*$c)-($a*$d) ) ).max;
+}
diff --git a/challenge-339/simon-proctor/raku/ch-2.raku b/challenge-339/simon-proctor/raku/ch-2.raku
new file mode 100755
index 0000000000..adfeeea5ce
--- /dev/null
+++ b/challenge-339/simon-proctor/raku/ch-2.raku
@@ -0,0 +1,21 @@
+#!/usr/bin/env raku
+
+subset IsTrue of Bool where so *;
+
+multi sub MAIN( IsTrue :t(:$test) ) is hidden-from-USAGE {
+ use Test;
+ is peak-gain(-5, 1, 5, -9, 2),1;
+ is peak-gain(10, 10, 10, -25),30;
+ is peak-gain(3, -4, 2, 5, -6, 1), 6;
+ is peak-gain(-1, -2, -3, -4), 0;
+ is peak-gain(-10, 15, 5),10;
+ done-testing;
+}
+
+multi sub MAIN( *@gains where Int() ~~ all(*) ) {
+ peak-gain(|@gains).say;
+}
+
+sub peak-gain( *@ints where Int() ~~ all(*) ) {
+ ([\+] (0, |@ints)).max;
+}