]> www.fi.muni.cz Git - aoc.git/blob - 2019/48.pl
Day 25: examining the input
[aoc.git] / 2019 / 48.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4
5 my @map = [ map { chomp; [ split // ] } <> ];
6
7 my $min;
8 my $levels = 0;
9 while (1) {
10         say "After ", ++$min, ":";
11         my $count = 0;
12         my @nm;
13         $levels += 2;
14         for my $l (0 .. $levels) {
15                 say "Depth ", $l - $min;
16         for my $y (0 .. 4) {
17         for my $x (0 .. 4) {
18                 my $sum = 0;
19                 my @pts;
20                 for my ($dx, $dy) (1, 0, 0, 1, -1, 0, 0, -1) {
21                         my $nx = $x + $dx;
22                         my $ny = $y + $dy;
23                         if ($nx < 0) {
24                                 push @pts, [$l-2, 2, 1]; # L Y X
25                         } elsif ($ny < 0) {
26                                 push @pts, [$l-2, 1, 2];
27                         } elsif ($nx > 4) {
28                                 push @pts, [$l-2, 2, 3];
29                         } elsif ($ny > 4) {
30                                 push @pts, [$l-2, 3, 2];
31                         } elsif ($nx == 2 && $ny == 2) {
32                                 if ($x == 1) {
33                                         push @pts, [$l, $_, 0] for 0 .. 4;
34                                 } elsif ($y == 1) {
35                                         push @pts, [$l, 0, $_] for 0 .. 4;
36                                 } elsif ($x == 3) {
37                                         push @pts, [$l, $_, 4] for 0 .. 4;
38                                 } elsif ($y == 3) {
39                                         push @pts, [$l, 4, $_] for 0 .. 4;
40                                 }
41                         } else {
42                                 push @pts, [$l-1, $ny, $nx];
43                         }
44                 }
45                 for my $pt (@pts) {
46                         my ($nl, $ny, $nx) = @$pt;
47                         next if $nl < 0 || $nl > $levels-2;
48                         $sum++ if $map[$nl][$ny][$nx] eq '#';
49                 }
50                 if ($x == 2 & $y == 2) {
51                         $nm[$l][$y][$x] = '?';
52                 } elsif ($l > 0 && $l <= $levels-1 && $map[$l-1][$y][$x] eq '#') {
53                         $nm[$l][$y][$x] = $sum == 1 ? '#' : '.';
54                 } else {
55                         $nm[$l][$y][$x] = $sum == 1 || $sum == 2 ? '#' : '.';
56                 }
57                 print $nm[$l][$y][$x];
58                 $count++ if $nm[$l][$y][$x] eq '#';
59         }
60                 print "\n";
61         }
62                 print "\n";
63         }
64         @map = @nm;
65         print "==== $count ====\n";
66         last if $min >= 200;
67 }
68