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);
33 say "round ", ++$round;
36 for my $i (0 .. $#el) {
37 my ($x, $y, $state) = @{ $el[$i] };
40 for my $x1 ($x-1 .. $x+1) {
41 for my $y1 ($y-1 .. $y+1) {
42 $sum++ if $map{"$x1,$y1"};
47 for my $add (0 .. 3) {
48 my $dir = ($add + $state) % 4;
50 for my $x1 ($x-1 .. $x+1) {
51 next DIR if occupied(\%map, $x1, $y-1);
53 $prop = [ $x, $y-1, 1, $i ];
56 for my $x1 ($x-1 .. $x+1) {
57 next DIR if occupied(\%map, $x1, $y+1);
59 $prop = [ $x, $y+1, 2, $i ];
62 for my $y1 ($y-1 .. $y+1) {
63 next DIR if occupied(\%map, $x-1, $y1);
65 $prop = [ $x-1, $y, 3, $i ];
68 for my $y1 ($y-1 .. $y+1) {
69 next DIR if occupied(\%map, $x+1, $y1);
71 $prop = [ $x+1, $y, 0, $i ];
77 $prop{"$prop->[0],$prop->[1]"}++;
82 for my $i (0 .. $#prop) {
86 my ($x, $y) = @{ $el[$i] };
87 if ($prop{"$x1,$y1"} != 1) {
88 #say "$i not moving $x,$y -> $x1,$y1";
92 #say "$i moved $x,$y -> $x1,$y1";
98 ($xmin, $xmax, $ymin, $ymax) = (undef, undef, undef, undef);
101 $xmin = $x if !defined $xmin || $xmin > $x;
102 $ymin = $y if !defined $ymin || $ymin > $y;
103 $xmax = $x if !defined $xmax || $xmax < $x;
104 $ymax = $y if !defined $ymax || $ymax < $y;
108 say "$xmin .. $xmax, $ymin .. $ymax";
111 say "result $xmin .. $xmax $ymin .. $ymax";