aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-089/mark-anderson/raku/ch-1.p615
-rw-r--r--challenge-089/mark-anderson/raku/ch-2.p632
2 files changed, 47 insertions, 0 deletions
diff --git a/challenge-089/mark-anderson/raku/ch-1.p6 b/challenge-089/mark-anderson/raku/ch-1.p6
new file mode 100644
index 0000000000..01a4b13b9c
--- /dev/null
+++ b/challenge-089/mark-anderson/raku/ch-1.p6
@@ -0,0 +1,15 @@
+multi MAIN(UInt $n where * > 0) { #= greater than 0
+ say gcd-sum($n);
+}
+
+multi MAIN {
+ use Test;
+ plan 2;
+
+ ok gcd-sum(3) == 3, "Example 1";
+ ok gcd-sum(4) == 7, "Example 2";
+}
+
+sub gcd-sum(UInt $n) {
+ sum (1..$n).combinations(2).map(-> ($a, $b) { $a gcd $b });
+}
diff --git a/challenge-089/mark-anderson/raku/ch-2.p6 b/challenge-089/mark-anderson/raku/ch-2.p6
new file mode 100644
index 0000000000..47c7b8292b
--- /dev/null
+++ b/challenge-089/mark-anderson/raku/ch-2.p6
@@ -0,0 +1,32 @@
+#
+# With help from https://www.wikihow.com/Solve-a-Magic-Square
+#
+
+use Scalar::History;
+
+unit sub MAIN(UInt $n where * mod 2 = 3); #= a positive odd integer
+
+.say for odd-magic-square($n);
+
+sub odd-magic-square($n) {
+ subset Valid of UInt where 0 <= * < $n;
+
+ my $r := Scalar::History.create(0, Valid);
+ my $c := Scalar::History.create(($n / 2).floor, Valid);
+ my @matrix = [0 xx $n] xx $n;
+ @matrix[$r][$c] = 1;
+
+ for 2..($n**2) -> $num {
+ try $r--; if $! { $r = $n - 1 }
+ try $c++; if $! { $c = 0 }
+
+ if @matrix[$r][$c] {
+ $r = $r.VAR.get-history.tail + 1;
+ $c = $c.VAR.get-history.tail;
+ }
+
+ @matrix[$r][$c] = $num;
+ }
+
+ @matrix.map(*.fmt("%{($n**2).chars}d").Array);
+}