Files
Project-AOC-2024/Day6/Program.cs

84 lines
2.4 KiB
C#
Raw Normal View History

2024-12-06 17:21:01 +02:00
var lines = File.ReadAllLines("input.txt");
var charArray = new char[lines.Length, lines[0].Length];
Dictionary<Direction, (int dx, int dy)> 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<int[]>();
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<int[]> 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
}