diff options
| author | Mark Anderson <mark@frontrangerunner.com> | 2020-11-23 15:33:47 -0700 |
|---|---|---|
| committer | Mark Anderson <mark@frontrangerunner.com> | 2020-11-23 15:33:47 -0700 |
| commit | 11e8a25fd36566f94c79440c93ad2c3743221d72 (patch) | |
| tree | 33493a96bc16b92cf81bbb4dc7406bc38c29d1cd | |
| parent | a36f58dcbcc932577398a98e53e7c445cff7bd0f (diff) | |
| download | perlweeklychallenge-club-11e8a25fd36566f94c79440c93ad2c3743221d72.tar.gz perlweeklychallenge-club-11e8a25fd36566f94c79440c93ad2c3743221d72.tar.bz2 perlweeklychallenge-club-11e8a25fd36566f94c79440c93ad2c3743221d72.zip | |
initial
| -rw-r--r-- | challenge-088/mark-anderson/raku/ch-1.p6 | 18 | ||||
| -rw-r--r-- | challenge-088/mark-anderson/raku/ch-2.p6 | 56 |
2 files changed, 74 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..10ac6b394d --- /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).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..1215e036e6 --- /dev/null +++ b/challenge-088/mark-anderson/raku/ch-2.p6 @@ -0,0 +1,56 @@ +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 = @matrix.elems * @matrix[0].elems; + my $c = 0; + my @result; + + for @trips -> @t { + for @t -> @step { + @result.push: @step[$c..*-$c-2]; + } + $c++; + } + + @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 = @matrix / 2; + @result[*-1] = @matrix[$i][$i]; + } + + @result; +} |
