1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#!/usr/bin/env perl
use v5.20;
use utf8;
use strict;
use warnings;
use feature qw(say signatures);
no warnings 'experimental::signatures';
{
my $MATRIX = [
[ 1, 2, 3, 4 ], #
[ 5, 6, 7, 8 ], #
[ 9, 10, 11, 12 ], #
[ 13, 14, 15, 16 ], #
];
say join( ', ', spriral_matrix($MATRIX) )
}
sub spriral_matrix($matrix) {
my @matrix = @$matrix;
return () if !@matrix;
# get top and bottom row an remove them from the input
my ( $top, $bot );
( $top, @matrix ) = @$matrix;
( $bot, @matrix ) = ( $matrix[-1], @matrix[ 0 ... ( $#matrix - 1 ) ] );
# get left and right side from the remaining rows
my @right_side = map { $_->[-1] } @matrix;
@matrix = grep { @$_ } map { [ @{$_}[ 0 ... ( $#$_ - 1 ) ] ] } @matrix;
my @left_side = map { $_->[0] } @matrix;
@matrix = grep { @$_ } map { [ @{$_}[ 1 ... ( $#$_ ) ] ] } @matrix;
return ( @$top, @right_side, reverse( @{ $bot // [] } ),
reverse(@left_side), spriral_matrix( \@matrix ) );
}
|