4 use experimental 'multidimensional', 'for_list', 'builtin';
11 my @map = map { chomp; [ split //, ".$_." ] } <>;
12 push @map, [ ('.') x @{ $map[0]} ];
13 unshift @map, [ ('.') x @{$map[0]} ];
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';
26 '|' => [ 0, -1, 0, 1],
28 'J' => [-1, 0, 0, -1],
29 '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 '|') {
49 say "starting at $sx, $sy $map[$sy][$sx]";
53 while (!$seen{$sx,$sy}++) {
54 my @d = $dirs{ $map[$sy][$sx] }->@*;
55 if (!defined($px) || ($px != $d[0] || $py != $d[1])) {
69 say "loop len ", $len/2;
72 for my $x (0 .. $xmax) {
75 for my $y (0 .. $ymax) {
77 my $pt = $map[$y][$x];
80 } elsif ($pt eq '7') {
82 } elsif ($pt eq 'F') {
84 } elsif ($pt eq 'J') {
88 } elsif ($pt eq 'L') {
93 say "$x $y in $in left $left";