aboutsummaryrefslogtreecommitdiff
path: root/challenge-253/dave-jacoby/perl/ch-2.pl
blob: 0dd5e500904e2cd3f06d7af09db6d23461d7d33c (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env perl

use strict;
use warnings;
use experimental qw{ say postderef signatures state };

use List::Util qw{ max sum0 };

my @examples = (

    [
        [ 1, 1, 0, 0, 0 ],
        [ 1, 1, 1, 1, 0 ],
        [ 1, 0, 0, 0, 0 ],
        [ 1, 1, 0, 0, 0 ],
        [ 1, 1, 1, 1, 1 ]
    ],
    [ 
        [ 1, 0, 0, 0 ], 
        [ 1, 1, 1, 1 ], 
        [ 1, 0, 0, 0 ], 
        [ 1, 0, 0, 0 ] 
    ],
);

for my $input (@examples) {
    my @o      = weakest_row($input);
    my $output = join ', ', @o;
    my $matrix = format_matrix($input);

    say <<~"END";
    Input:  \$matrix = $matrix;
    Output: ($output)
    END
}

sub weakest_row ($matrix) {
    my %rank;
    for my $i ( 0 .. -1 + scalar $matrix->@* ) {
        my $r = $matrix->[$i];
        my $s = sum0 $r->@*;
        $rank{$i} = $s;
    }
    my @output = sort { $rank{$a} <=> $rank{$b} } sort keys %rank;
    return @output;
}

sub format_matrix ($matrix) {
    my $maxlen = max map { length $_ } map { $_->@* } $matrix->@*;
    my $output = join "\n                  ", '[', (
        map { qq{  [$_],} } map {
            join ',',
                map { pad( $_, 1 + $maxlen ) }
                $_->@*
        } map { $matrix->[$_] } 0 .. -1 + scalar $matrix->@*
        ),
        ']';
    return $output;
}

sub pad ( $str, $len = 4 ) { return sprintf "%${len}s", $str; }