]> www.fi.muni.cz Git - aoc2020.git/blob - 48.pl
Day 24 - nice!
[aoc2020.git] / 48.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my %tiles;
6
7 my ($min_x, $max_x, $min_y, $max_y);
8
9 while (<>) {
10         chomp;
11         my ($x, $y) = (0, 0);
12         while (length) {
13                 s/\A(se|ne|sw|nw|e|w)//;
14                 if ($1 eq 'ne') {
15                         $y++;
16                 } elsif ($1 eq 'e') {
17                         $x++;
18                 } elsif ($1 eq 'se') {
19                         $x++; $y--;
20                 } elsif ($1 eq 'sw') {
21                         $y--;
22                 } elsif ($1 eq 'w') {
23                         $x--;
24                 } elsif ($1 eq 'nw') {
25                         $x--; $y++;
26                 }
27         }
28         $tiles{"$x|$y"} ^= 1;
29         $min_x = $x if !defined $min_x || $min_x > $x;
30         $max_x = $x if !defined $max_x || $max_x < $x;
31         $min_y = $y if !defined $min_y || $min_y > $y;
32         $max_y = $y if !defined $max_y || $max_y < $y;
33 }
34
35
36 for (1 .. 100) {
37         $min_x--; $min_y--; $max_x++, $max_y++;
38         my %newtiles;
39         for my $x ($min_x .. $max_x) {
40         for my $y ($min_y .. $max_y) {
41                 my $count = 0;
42                 $count++ if $tiles{($x+1).'|'.($y)}; # E
43                 $count++ if $tiles{($x).'|'.($y+1)}; # NE
44                 $count++ if $tiles{($x+1).'|'.($y-1)}; # SE
45                 $count++ if $tiles{($x).'|'.($y-1)}; # SW
46                 $count++ if $tiles{($x-1).'|'.($y)}; # W
47                 $count++ if $tiles{($x-1).'|'.($y+1)}; # NW
48                 if ($tiles{"$x|$y"} && ($count == 0 || $count > 2)) {
49                         $newtiles{"$x|$y"} = 0;
50                 } elsif (!$tiles{"$x|$y"} && $count == 2) {
51                         $newtiles{"$x|$y"} = 1;
52                 } else {
53                         $newtiles{"$x|$y"} = $tiles{"$x|$y"};
54                 }
55         }
56         }
57         %tiles = %newtiles;
58         print "Tiles=" . (grep { $tiles{$_} } keys %tiles)."\n";
59 }
60