Answer ⏱  1905ms
                        
                                                        Part 1 : 
                            5462
                            Part 2 : 
                            2512135
                        
                     
                    function solve($grid, $steps, $part2 = false) {
    $count = 0;
    $dir   = 0; // N, E, S, W
    [$x, $y] = [(int) floor(count($grid[0]) / 2), (int) floor(count($grid) / 2)];
    for ($i = 0; $i < $steps; $i++) {
        $grid[$y][$x] = $grid[$y][$x] ?? ".";
        $dir = match ($grid[$y][$x]) {
            "#" => Math::mod(($dir + 1), 4),
            "." => Math::mod(($dir - 1), 4),
            "F" => Math::mod(($dir + 2), 4),
            "W" => $dir
        };
        $grid[$y][$x] = match ($grid[$y][$x]) {
            "#" => $part2 ? "F" : ".",
            "." => $part2 ? "W" : "#",
            "F" => ".",
            "W" => "#"
        };
        if ($grid[$y][$x] == "#") $count++;
        match ($dir) {
            0 => $y--,
            1 => $x++,
            2 => $y++,
            3 => $x--,
        };
    }
    return $count;
}
// ==================================================
// > SOLUTIONS
// ==================================================
$grid = array_map("str_split", explode("\n", $input->string));
$solution_1 = solve($grid, 10_000);
$solution_2 = solve($grid, 10_000_000, true);