aboutsummaryrefslogtreecommitdiff
path: root/challenge-128/arne-sommer/raku/maximum-sub-matrix
blob: 0ac3271037730ececf60da76d0b9475371c1757e (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#! /usr/bin/env raku

unit sub MAIN (Str $matrix = "1 0 0 0 1 0 | 1 1 0 0 0 1 | 1 0 0 0 0 0", :v(:$verbose)); 

my @m = $matrix.split("|")>>.words>>.Numeric; ## .List;

die "Illegal characters" unless all($matrix.words) eq any(0,1,'|');

die "No zeros" unless any($matrix.words) eq '0';
die "Uneven row length" unless all(@m>>.elems) == @m[0].elems && @m[0].elems > 0;

my $number-of-rows = @m.elems;     my $last-row = $number-of-rows -1;
my $number-of-cols = @m[0].elems;  my $last-col = $number-of-cols -1;

say ": Rows: $number-of-rows, cols: $number-of-cols" if $verbose;

my $largest-size = 0;
my $largest-rows = 0;
my $largest-cols = 0;

for 0 .. $last-row -> $from-row
{
  for $last-row ... $from-row -> $to-row
  {
    for 0 .. $last-col -> $from-col
    {
      for $last-col ... $from-col -> $to-col
      {
        my $size = ($to-row - $from-row +1) * ($to-col - $from-col +1); 
        next if $size <= $largest-size;

	my @rect = get-rectangle(@m, $from-row, $from-col, $to-row, $to-col);
	my $zero = zero-rectangle(@rect);
	
        say ": Checking rectangle [UL: $from-row, $from-col][LR: $to-row, $to-col]: ",
	  "{ @rect.raku }  ---> $zero" if $verbose;

        if $zero
	{
	  my $rows = 1 + $to-row - $from-row;
	  my $cols = 1 + $to-col - $from-col;
          my $size = $rows * $cols ;

          if $size > $largest-size
	  {
	    say ": - Largest so far $size ($rows x $cols)" if $verbose;
            $largest-size = $size;
            $largest-rows = $rows;
            $largest-cols = $cols;
          }
        }
      }
    }
  }
}

if $largest-size
{
  say ": Largest with size $largest-size ($largest-rows x $largest-cols)" if $verbose;
  say "[ { '0' xx $largest-cols } ]" for ^$largest-rows;
}
else
{
  say "[]";
}

sub get-rectangle(@matrix, $x1, $y1, $x2, $y2)
{
  return (($x1 .. $x2).map({ @m[$_][$y1 .. $y2] }));
}

sub zero-rectangle (@matrix)
{
  return so all(@matrix.List.flat) eq "0";
}