]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 20: nothing to win, everything to lose
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 21 Dec 2021 06:19:47 +0000 (07:19 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 21 Dec 2021 06:19:47 +0000 (07:19 +0100)
39.pl [new file with mode: 0755]

diff --git a/39.pl b/39.pl
new file mode 100755 (executable)
index 0000000..e4d6c01
--- /dev/null
+++ b/39.pl
@@ -0,0 +1,76 @@
+#!/usr/bin/perl -w
+
+use v5.16;
+
+my @m = split //, <>;
+scalar <>;
+
+$; = ',';
+my @image = map { chomp; [ split // ] } <>;
+
+my $odd = 1;
+sub enhance {
+       my $img = shift;
+       my $ymax = @$img;
+       my $xmax = @{ $img->[0] };
+
+       say "odd=$odd, m0=$m[0]";
+
+       my @rv;
+       for my $y (0 .. $ymax+3) {
+               for my $x (0 .. $xmax+3) {
+                       my $idx = 0;
+                       for my $dy (-2 .. 0) {
+                               my $y2 = $y+$dy;
+                               for my $dx (-2 .. 0) {
+                                       my $x2 = $x+$dx;
+                                       # say "$x,$y + $dx,$dy = $x2, $y2";
+                                       $idx <<= 1;
+                                       if ($y2 >= 0 && $y2 < $ymax
+                                               && $x2 >= 0 && $x2 < $xmax) {
+                                                       $idx++ if $img->[$y2][$x2] eq '#';
+                                       } else {
+                                               $idx++ if !$odd && ($m[0] eq '#');
+                                       }
+                               }
+                       }
+                       # say "$x,$y => $idx => $m[$idx]";
+                       $rv[$y][$x] = $m[$idx];
+               }
+       }
+
+       $odd = !$odd;
+
+       return @rv;
+}
+
+sub imgdump {
+       my $img = shift;
+       my $ymax = @$img;
+       my $xmax = @{ $img->[0] };
+
+       my $sum;
+
+       say "$xmax x $ymax";
+       for my $y (0 .. $ymax-1) {
+               for my $x (0 .. $xmax-1) {
+                       print $img->[$y][$x];
+                       $sum++ if $img->[$y][$x] eq '#';
+               }
+               print "\n";
+       }
+       say "sum=$sum";
+}
+
+for (1 .. 50) {
+       imgdump(\@image);
+       @image = enhance(\@image);
+}
+imgdump(\@image);
+my $sum = 0;
+for my $row (@image) {
+       for my $pixel (@$row) {
+               $sum++ if $pixel eq '#';
+       }
+}
+say "pixels = $sum";