#!/usr/bin/perl -w

use v5.38;
use experimental 'multidimensional';
$; = ';';

my @map;
my ($x, $y);

while (<>) {
	chomp;
	if (/S/g) {
		$x = pos;
		$y = 1 + @map;
	}
	push @map, [ split //, ".$_." ];
}

push    @map, [ ('.') x @{ $map[0] } ];
unshift @map, [ ('.') x @{ $map[0] } ];

my $xmax = $#{$map[0]};
my $ymax = $#map;

# 0=E 1=S 2=W 3=N
my %dirs = (
	'|' => '13',
	'-' => '02',
	'J' => '23',
	'L' => '03',
	'F' => '01',
	'7' => '12',
);
my @dx = (1, 0, -1, 0);
my @dy = (0, 1, 0, -1);

my $dir;
for my $d (0 .. 3) {
	my $revdir = $d ^ 2;
	my $p = $map[ $y+$dy[$d] ][ $x+$dx[$d] ];
	$dir .= $d if $dirs{$p} =~ /$revdir/;
}

my %dir2sym = reverse %dirs;
$map[$y][$x] = $dir2sym{$dir}; # fill in the start point
$dir =~ s/.//; # Take any valid direction

my %seen;
while (1) {
	$x += $dx[$dir];
	$y += $dy[$dir];
	last if $seen{$x,$y}++;
	$dir ^= 2;
	($dir) = $dirs{ $map[$y][$x] } =~ /([^$dir])/;
}

say "loop half: ", (keys %seen)/2;

my $sum;
for my $y (0 .. $ymax) {
	my $in = 0;
	for my $x (0 .. $xmax) {
		if ($seen{$x,$y}) {
			my $pt = $map[$y][$x];
			$in += 2 if $pt eq '|';
			$in++    if $pt =~ /[L7]/;
			$in--    if $pt =~ /[FJ]/;
		} elsif ($in % 4 == 2) {
			$sum++;
		}
	}
}

say "inside: ", $sum;
