aboutsummaryrefslogtreecommitdiff
path: root/challenge-101/mark-anderson
diff options
context:
space:
mode:
authorMark A <andemark@a-iot1t.uch.ad.pvt>2021-02-22 03:32:10 -0700
committerMark A <andemark@a-iot1t.uch.ad.pvt>2021-02-22 03:32:10 -0700
commit2603f59ed434830438acfc1417c0e0801931cd2b (patch)
tree0acf192891220731b71623fa9695824e125b0df8 /challenge-101/mark-anderson
parent2c26164a5a90aa14a19078d845769d3ec9fbb5ae (diff)
downloadperlweeklychallenge-club-2603f59ed434830438acfc1417c0e0801931cd2b.tar.gz
perlweeklychallenge-club-2603f59ed434830438acfc1417c0e0801931cd2b.tar.bz2
perlweeklychallenge-club-2603f59ed434830438acfc1417c0e0801931cd2b.zip
initial ch-1.raku
Diffstat (limited to 'challenge-101/mark-anderson')
-rw-r--r--challenge-101/mark-anderson/raku/ch-1.p672
1 files changed, 72 insertions, 0 deletions
diff --git a/challenge-101/mark-anderson/raku/ch-1.p6 b/challenge-101/mark-anderson/raku/ch-1.p6
new file mode 100644
index 0000000000..403ca98fa8
--- /dev/null
+++ b/challenge-101/mark-anderson/raku/ch-1.p6
@@ -0,0 +1,72 @@
+#!/usr/bin/env raku
+
+use Test;
+plan 5;
+
+is-deeply pack-a-spiral(1..4), [[4, 3], [1, 2]];
+is-deeply pack-a-spiral(1..6), [[6, 5, 4], [1, 2, 3]];
+is-deeply pack-a-spiral(1..12), [[9, 8, 7, 6], [10, 11, 12, 5], [1, 2, 3, 4]];
+is-deeply pack-a-spiral(1..143),
+[
+[ 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23],
+[ 36, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 22],
+[ 37, 74, 103, 102, 101, 100, 99, 98, 97, 96, 95, 62, 21],
+[ 38, 75, 104, 125, 124, 123, 122, 121, 120, 119, 94, 61, 20],
+[ 39, 76, 105, 126, 139, 138, 137, 136, 135, 118, 93, 60, 19],
+[ 40, 77, 106, 127, 140, 141, 142, 143, 134, 117, 92, 59, 18],
+[ 41, 78, 107, 128, 129, 130, 131, 132, 133, 116, 91, 58, 17],
+[ 42, 79, 108, 109, 110, 111, 112, 113, 114, 115, 90, 57, 16],
+[ 43, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 56, 15],
+[ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 14],
+[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
+];
+is-deeply pack-a-spiral(1..144),
+[
+[ 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23],
+[ 35, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 22],
+[ 36, 73, 102, 101, 100, 99, 98, 97, 96, 95, 62, 21],
+[ 37, 74, 103, 124, 123, 122, 121, 120, 119, 94, 61, 20],
+[ 38, 75, 104, 125, 138, 137, 136, 135, 118, 93, 60, 19],
+[ 39, 76, 105, 126, 139, 144, 143, 134, 117, 92, 59, 18],
+[ 40, 77, 106, 127, 140, 141, 142, 133, 116, 91, 58, 17],
+[ 41, 78, 107, 128, 129, 130, 131, 132, 115, 90, 57, 16],
+[ 42, 79, 108, 109, 110, 111, 112, 113, 114, 89, 56, 15],
+[ 43, 80, 81, 82, 83, 84, 85, 86, 87, 88, 55, 14],
+[ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 13],
+[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+];
+
+sub pack-a-spiral(@A is copy)
+{
+ my $f = tightest-factor(@A.elems);
+ my @k = @A.keys.rotor($f);
+ @k = spiral(@k.map(*.Array).Array);
+ @A[@k] = @A;
+ @A.rotor($f).map(*.Array).reverse.Array;
+}
+
+sub tightest-factor($n)
+{
+ return 1 if $n.is-prime;
+ my $s = sqrt($n);
+ return $s if $s.narrow ~~ UInt;
+ my @f = grep { $n %% $_ }, 2..$n/2;
+ return @f[@f/2];
+}
+
+#
+#| code from challenge 88
+#
+sub spiral(@matrix) {
+ my @r;
+
+ while @matrix
+ {
+ @r.append: |@matrix.shift;
+ try { @r.push: .pop } for @matrix;
+ try @r.append: $_ given @matrix.pop.reverse;
+ try -> $i { @r.push: .[$i].shift } for .end...0 given @matrix;
+ }
+
+ @r;
+}