diff options
| -rw-r--r-- | challenge-089/mark-anderson/raku/ch-1.p6 | 15 | ||||
| -rw-r--r-- | challenge-089/mark-anderson/raku/ch-2.p6 | 32 |
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); +} |
