aboutsummaryrefslogtreecommitdiff
path: root/challenge-088/alexander-pankoff/perl/ch-2.pl
blob: 3f14285681ad3ce60c8c76b603c1bf2c4394d935 (plain)
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 ) );
}