]> www.fi.muni.cz Git - aoc.git/blobdiff - 2019/48.pl
Rest of 2019
[aoc.git] / 2019 / 48.pl
diff --git a/2019/48.pl b/2019/48.pl
new file mode 100755 (executable)
index 0000000..bf0bdd4
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/perl -w
+
+use v5.16;
+
+my @map = [ map { chomp; [ split // ] } <> ];
+
+my $min;
+my $levels = 0;
+while (1) {
+       say "After ", ++$min, ":";
+       my $count = 0;
+       my @nm;
+       $levels += 2;
+       for my $l (0 .. $levels) {
+               say "Depth ", $l - $min;
+       for my $y (0 .. 4) {
+       for my $x (0 .. 4) {
+               my $sum = 0;
+               my @pts;
+               for my ($dx, $dy) (1, 0, 0, 1, -1, 0, 0, -1) {
+                       my $nx = $x + $dx;
+                       my $ny = $y + $dy;
+                       if ($nx < 0) {
+                               push @pts, [$l-2, 2, 1]; # L Y X
+                       } elsif ($ny < 0) {
+                               push @pts, [$l-2, 1, 2];
+                       } elsif ($nx > 4) {
+                               push @pts, [$l-2, 2, 3];
+                       } elsif ($ny > 4) {
+                               push @pts, [$l-2, 3, 2];
+                       } elsif ($nx == 2 && $ny == 2) {
+                               if ($x == 1) {
+                                       push @pts, [$l, $_, 0] for 0 .. 4;
+                               } elsif ($y == 1) {
+                                       push @pts, [$l, 0, $_] for 0 .. 4;
+                               } elsif ($x == 3) {
+                                       push @pts, [$l, $_, 4] for 0 .. 4;
+                               } elsif ($y == 3) {
+                                       push @pts, [$l, 4, $_] for 0 .. 4;
+                               }
+                       } else {
+                               push @pts, [$l-1, $ny, $nx];
+                       }
+               }
+               for my $pt (@pts) {
+                       my ($nl, $ny, $nx) = @$pt;
+                       next if $nl < 0 || $nl > $levels-2;
+                       $sum++ if $map[$nl][$ny][$nx] eq '#';
+               }
+               if ($x == 2 & $y == 2) {
+                       $nm[$l][$y][$x] = '?';
+               } elsif ($l > 0 && $l <= $levels-1 && $map[$l-1][$y][$x] eq '#') {
+                       $nm[$l][$y][$x] = $sum == 1 ? '#' : '.';
+               } else {
+                       $nm[$l][$y][$x] = $sum == 1 || $sum == 2 ? '#' : '.';
+               }
+               print $nm[$l][$y][$x];
+               $count++ if $nm[$l][$y][$x] eq '#';
+       }
+               print "\n";
+       }
+               print "\n";
+       }
+       @map = @nm;
+       print "==== $count ====\n";
+       last if $min >= 200;
+}
+