5 use List::Util qw(max);
6 use feature 'multidimensional';
9 my ($minx, $miny, $maxx, $maxy) = (0, 0, 0, 0);
17 sub walk($positions, $re) {
20 for my $p (@$positions) {
21 next if $seen{$p->[0],$p->[1]}++;
25 say "len=", length($re), " npos=", scalar @npos;
30 my ($first, $rest) = $re =~ /\A(.)(.*)\z/;
32 if ($first =~ /[NSWE]/) {
35 if ($first eq 'N') { $hdoor{$x,$y} = 1; $y--; }
36 elsif ($first eq 'S') { $y++; $hdoor{$x,$y} = 1; }
37 elsif ($first eq 'W') { $vdoor{$x,$y} = 1; $x--; }
38 elsif ($first eq 'E') { $x++; $vdoor{$x,$y} = 1; }
41 $minx = $x if $minx > $x;
42 $maxx = $x if $maxx < $x;
43 $miny = $y if $miny > $y;
44 $maxy = $y if $maxy < $y;
46 } elsif ($first eq '|') {
48 @npos = map { [ @$_ ] } @$positions;
49 } elsif ($first eq ')') {
52 } elsif ($first eq '(') {
53 my ($n, $re1) = walk(\@npos, $rest);
63 for my $y ($miny .. $maxy+1) {
64 for my $x ($minx .. $maxx) {
65 print $hdoor{$x,$y} ? '#-' : '##';
69 for my $x ($minx .. $maxx) {
70 print $vdoor{$x,$y} ? '|.' : '#.';
77 walk([ [0, 0] ], $re);
80 my @q = ([ 0, 0, 0 ]);
88 my ($x, $y, $dist) = @$h;
89 $rooms++ if $dist >= 1000;
91 if (!$max_dist || $dist > $max_dist) {
94 if ($hdoor{$x,$y} && !$seen{$x,$y-1}++) {
95 push @q, [$x, $y-1, $dist+1];
97 if ($hdoor{$x,$y+1} && !$seen{$x,$y+1}++) {
98 push @q, [$x, $y+1, $dist+1];
100 if ($vdoor{$x,$y} && !$seen{$x-1,$y}++) {
101 push @q, [$x-1, $y, $dist+1];
103 if ($vdoor{$x+1,$y} && !$seen{$x+1,$y}++) {
104 push @q, [$x+1, $y, $dist+1];