var lines = File.ReadAllLines("input.txt"); var charArray = new char[lines.Length, lines[0].Length]; Dictionary moves = new() { { Direction.Up, (-1, 0) }, { Direction.Right, (0, 1) }, { Direction.Down, (1, 0) }, { Direction.Left, (0, -1) } }; var guardCurrentPosition = (0, 0); var guardDirection = Direction.Up; var visitedPositions = new List(); for (var i = 0; i < charArray.GetLength(0); i++) for (var j = 0; j < charArray.GetLength(1); j++) { if (lines[i][j] == '^') { guardCurrentPosition.Item1 = i; guardCurrentPosition.Item2 = j; visitedPositions.Add([guardCurrentPosition.Item1, guardCurrentPosition.Item2]); } charArray[i, j] = lines[i][j]; } var nextPosition = CalculateNextPosition(guardCurrentPosition.Item1, guardCurrentPosition.Item2, guardDirection); while (IsValid(nextPosition.Item1, nextPosition.Item2, charArray)) { if (IsBlocked(nextPosition.Item1, nextPosition.Item2, charArray)) { guardDirection = (Direction)(((int)guardDirection + 1) % 4); } else { guardCurrentPosition = (nextPosition.Item1, nextPosition.Item2); visitedPositions.Add([guardCurrentPosition.Item1, guardCurrentPosition.Item2]); } nextPosition = CalculateNextPosition(guardCurrentPosition.Item1, guardCurrentPosition.Item2, guardDirection); } Console.WriteLine($"Part1: {visitedPositions.Select(x => $"r{x[0]},c{x[1]}").Distinct().Count()}"); PrintMap(charArray, visitedPositions); (int, int) CalculateNextPosition(int row, int col, Direction direction) { var (dx, dy) = moves[direction]; return (row + dx, col + dy); } bool IsValid(int row, int column, char[,] grid) => row >= 0 && row < grid.GetLength(0) && column >= 0 && column < grid.GetLength(1); bool IsBlocked(int row, int col, char[,] grid) => grid[row, col] == '#'; void PrintMap(char[,] input, List visitedPositions) { for (var i = 0; i < input.GetLength(0); i++) { for (var j = 0; j < input.GetLength(1); j++) { if (visitedPositions.Any(x => x[0] == i && x[1] == j) && input[i, j] != '^') { Console.Write("X"); } else { Console.Write(input[i, j]); } } Console.WriteLine(); } } enum Direction { Up, Right, Down, Left }