4 use experimental 'multidimensional', 'for_list', 'builtin';
11 my @map = map { chomp; [ split //, ".$_." ] } <>;
12 push @map, [ ('.') x @map ];
13 unshift @map, [ ('.') x @map ];
14 my $xmax = $#{$map[0]};
18 for my $x (0 .. $xmax) {
19 for my $y (0 .. $ymax) {
20 next if $map[$y][$x] ne 'S';
24 say "starting at $sx, $sy";
27 '|' => [ 0, -1, 0, 1],
29 'J' => [-1, 0, 0, -1],
30 'L' => [ 1, 0, 0, -1],
35 if ($map[$sy][$sx-1] eq '-' && $map[$sy][$sx+1] eq '-') {
37 } elsif ($map[$sy+1][$sx] eq '|' && $map[$sy-1][$sx] eq '|') {
39 } elsif ($map[$sy][$sx-1] eq '-' && $map[$sy-1][$sx] eq '|') {
41 } elsif ($map[$sy][$sx-1] eq '-' && $map[$sy+1][$sx] eq '|') {
43 } elsif ($map[$sy][$sx+1] eq '-' && $map[$sy-1][$sx] eq '|') {
45 } elsif ($map[$sy][$sx+1] eq '-' && $map[$sy+1][$sx] eq '|') {
52 while (!$seen{$sx,$sy}++) {
53 my @d = $dirs{ $map[$sy][$sx] }->@*;
54 say "map: $map[$sy][$sx] @d";
55 if (!defined($px) || ($px != $d[0] || $py != $d[1])) {
69 say "at $sx $sy $map[$sy][$sx] from $px $py len $len";