diff options
| -rw-r--r-- | challenge-088/mark-anderson/raku/ch-1.p6 | 18 | ||||
| -rw-r--r-- | challenge-088/mark-anderson/raku/ch-2.p6 | 54 |
2 files changed, 72 insertions, 0 deletions
diff --git a/challenge-088/mark-anderson/raku/ch-1.p6 b/challenge-088/mark-anderson/raku/ch-1.p6 new file mode 100644 index 0000000000..64036b5b28 --- /dev/null +++ b/challenge-088/mark-anderson/raku/ch-1.p6 @@ -0,0 +1,18 @@ +multi MAIN(*@n where .all ~~ Int) { + say array-of-product(@n).raku; +} + +multi MAIN { + use Test; + plan 2; + + my @n = [5, 2, 1, 4, 3]; + cmp-ok array-of-product(@n), &[eqv], [24, 60, 120, 30, 40], "Example 1"; + + @n = [2, 1, 4, 3]; + cmp-ok array-of-product(@n), &[eqv], [12, 24, 6, 8], "Example 2"; +} + +sub array-of-product(@n) { + @n.keys.map(-> $i { [*] @n[^$i, $i+1..@n.end].flat }).Array; +} diff --git a/challenge-088/mark-anderson/raku/ch-2.p6 b/challenge-088/mark-anderson/raku/ch-2.p6 new file mode 100644 index 0000000000..000716f7a2 --- /dev/null +++ b/challenge-088/mark-anderson/raku/ch-2.p6 @@ -0,0 +1,54 @@ +use Test; +plan 4; + +my @matrix = [ 1, 2, 3 ], + [ 4, 5, 6 ], + [ 7, 8, 9 ]; + +cmp-ok spiral(@matrix), &[eqv], [1, 2, 3, 6, 9, 8, 7, 4, 5], "Example 1"; + +@matrix = [ 1 .. 4 ], + [ 5 .. 8 ], + [ 9 .. 12 ], + [ 13 .. 16 ]; + +cmp-ok spiral(@matrix), &[eqv], + [1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10], "Example 2"; + +@matrix = [ 1, 2 ], + [ 3, 4 ], + [ 5, 6 ], + [ 7, 8 ]; + +cmp-ok spiral(@matrix), &[eqv], [1, 2, 4, 6, 8, 7, 5, 3], "Rows > Cols"; + +@matrix = [ 1, 2, 3, 4 ], + [ 5, 6, 7, 8 ]; + +cmp-ok spiral(@matrix), &[eqv], [1, 2, 3, 4, 8, 7, 6, 5], "Cols > Rows"; + +sub spiral(@step1) { + my @step2 = ([Z] @step1).reverse; + my @step3 = ([Z] @step2).reverse; + my @step4 = ([Z] @step3).reverse; + my @trips = [Z] @step1, @step2, @step3, @step4; + my $elems = @step1.elems * @step1[0].elems; + my @result; + + for @trips.kv -> $k, @t { + for @t -> @step { + @result.push: @step[$k..*-$k-2]; + } + } + + @result = (@result>>.Array).flat[^$elems]; + + # handle the case when matrix is 3 X 3, 5 X 5, 7 X 7 + # etc. where I can't seem to get the center element :( + unless @result[*-1] { + my $i = @step1 / 2; + @result[*-1] = @step1[$i][$i]; + } + + @result; +} |
