]> www.fi.muni.cz Git - aoc2021.git/blob - 18.pl
Day 9: special cases. not pretty.
[aoc2021.git] / 18.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4
5 my @m = map { chomp; [ split // ]; } <>; 
6 my $maxy = $#m;
7 my $maxx = $#{$m[0]};
8 say "$maxx x $maxy";
9
10 my @low;
11 for my $y (0 .. $maxy) {
12         for my $x (0 .. $maxx) {
13                 my $val = $m[$y][$x];
14                 next if $y > 0     && $m[$y-1][$x] <= $val;
15                 next if $y < $maxy && $m[$y+1][$x] <= $val;
16                 next if $x > 0     && $m[$y][$x-1] <= $val;
17                 next if $x < $maxx && $m[$y][$x+1] <= $val;
18                 push @low, [$x, $y];
19         }
20 }
21
22 my @sizes;
23
24 for my $start (@low) {
25         my $added = 0;
26         my $size =1;
27         my @points = ($start);
28         my %pts = (join(',', @$start) => 1);
29         do {
30                 $added = 0;
31                 for my $p (@points) {
32                         for my $add (([0, 1], [1, 0], [-1, 0], [0, -1])) {
33                                 my ($x, $y) = ($p->[0]+$add->[0], $p->[1]+$add->[1]);
34                                 # say "trying $x, $y";
35                                 next if $pts{join(',',$x,$y)};
36                                 next if $x < 0 || $x > $maxx;
37                                 next if $y < 0 || $y > $maxy;
38                                 next if $m[$y][$x] == 9;
39                                 $added = 1;
40                                 $pts{join(',',$x,$y)} = 1;
41                                 push @points, [$x, $y];
42                                 # say "adding $x, $y = $m[$y][$x]";
43                                 $size++;
44                         }
45                 }
46         } while ($added);
47         # say "$start->[0], $start->[1] : $size";
48         push @sizes, $size;
49 }
50
51 @sizes = sort { $b <=> $a } @sizes;
52
53 say $sizes[0]*$sizes[1]*$sizes[2];
54
55
56