--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my ($gx, $gy, $gd);
+for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ ($gx, $gy, $gd) = ($x, $y, $map[$y][$x])
+ if $map[$y][$x] !~ /[\.\#]/;
+ }
+}
+
+my %dir = (
+ '^' => [0, -1],
+ '>' => [1, 0],
+ 'v' => [0, 1],
+ '<' => [-1, 0],
+);
+
+my %seen;
+while (1) {
+ $seen{"$gx,$gy"}++;
+ my ($dx, $dy) = $dir{$gd}->@*;
+ $dx += $gx;
+ $dy += $gy;
+ last if $dx < 0 || $dx > $xmax || $dy < 0 || $dy > $ymax;
+ if ($map[$dy][$dx] eq '#') {
+ $gd =~ y/^>v</>v<^/;
+ } else {
+ ($gx, $gy) = ($dx, $dy);
+ }
+}
+
+say scalar keys %seen;
+
--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my ($gx, $gy, $gd);
+for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ ($gx, $gy, $gd) = ($x, $y, $map[$y][$x])
+ if $map[$y][$x] !~ /[\.\#]/;
+ }
+}
+
+my %dir = (
+ '^' => [0, -1],
+ '>' => [1, 0],
+ 'v' => [0, 1],
+ '<' => [-1, 0],
+);
+
+sub loops($map, $gx, $gy, $gd) {
+ my %seen;
+ while (1) {
+ return 1 if $seen{"$gx,$gy,$gd"}++;
+ # say "at $gx,$gy,$gd";
+ my ($dx, $dy) = $dir{$gd}->@*;
+ $dx += $gx;
+ $dy += $gy;
+ return 0 if $dx < 0 || $dx > $xmax || $dy < 0 || $dy > $ymax;
+ if ($map->[$dy][$dx] eq '#') {
+ $gd =~ y/^>v</>v<^/;
+ } else {
+ ($gx, $gy) = ($dx, $dy);
+ }
+ }
+}
+
+my $count;
+for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ next if $map[$y][$x] ne '.';
+ my @m1 = map { [ @$_ ] } @map;
+ $m1[$y][$x] = '#';
+ $count++ if loops(\@m1, $gx, $gy, $gd);
+ }
+}
+
+say $count;
+