14 for my $pt (split //) {
17 push @el, [ $x, $y, 0 ];
24 sub occupied($map, $x, $y) {
25 return $map->{"$x,$y"};
28 my ($xmin, $xmax, $ymin, $ymax);
32 say "round ", ++$round;
35 for my $i (0 .. $#el) {
36 my ($x, $y, $state) = @{ $el[$i] };
39 for my $x1 ($x-1 .. $x+1) {
40 for my $y1 ($y-1 .. $y+1) {
41 $sum++ if $map{"$x1,$y1"};
46 for my $add (0 .. 3) {
47 my $dir = ($add + $state) % 4;
49 for my $x1 ($x-1 .. $x+1) {
50 next DIR if occupied(\%map, $x1, $y-1);
52 $prop = [ $x, $y-1, 1, $i ];
55 for my $x1 ($x-1 .. $x+1) {
56 next DIR if occupied(\%map, $x1, $y+1);
58 $prop = [ $x, $y+1, 2, $i ];
61 for my $y1 ($y-1 .. $y+1) {
62 next DIR if occupied(\%map, $x-1, $y1);
64 $prop = [ $x-1, $y, 3, $i ];
67 for my $y1 ($y-1 .. $y+1) {
68 next DIR if occupied(\%map, $x+1, $y1);
70 $prop = [ $x+1, $y, 0, $i ];
76 $prop{"$prop->[0],$prop->[1]"}++;
80 for my $i (0 .. $#prop) {
84 my ($x, $y) = @{ $el[$i] };
85 if ($prop{"$x1,$y1"} != 1) {
93 ($xmin, $xmax, $ymin, $ymax) = (undef, undef, undef, undef);
96 $xmin = $x if !defined $xmin || $xmin > $x;
97 $ymin = $y if !defined $ymin || $ymin > $y;
98 $xmax = $x if !defined $xmax || $xmax < $x;
99 $ymax = $y if !defined $ymax || $ymax < $y;
105 say (($xmax - $xmin + 1) * ($ymax - $ymin + 1) - @el);