Day 4
This commit is contained in:
98
Day4/Program.cs
Normal file
98
Day4/Program.cs
Normal file
@@ -0,0 +1,98 @@
|
||||
var lines = File.ReadAllLines("input.txt");
|
||||
var charArray = new char[lines.Length, lines[0].Length];
|
||||
|
||||
for (var i = 0; i < charArray.GetLength(0); i++)
|
||||
for (var j = 0; j < charArray.GetLength(1); j++)
|
||||
{
|
||||
charArray[i, j] = lines[i][j];
|
||||
}
|
||||
|
||||
Console.WriteLine($"Part1: {FindXmas(charArray)}\nPart2: {FindMas(charArray)}");
|
||||
|
||||
int FindMas(char[,] grid)
|
||||
{
|
||||
var rows = grid.GetLength(0);
|
||||
var cols = grid.GetLength(1);
|
||||
|
||||
var directions = new[,]
|
||||
{
|
||||
{ -1, 1 }, // diagonal up right
|
||||
{ 1, 1 }, // diagonal down right
|
||||
{ -1, -1 }, // diagonal up left
|
||||
{ 1, -1 } // diagonal down left
|
||||
};
|
||||
|
||||
List<string> masCenterCoordinates = new();
|
||||
|
||||
for (var r = 0; r < rows; r++)
|
||||
{
|
||||
for (var c = 0; c < cols; c++)
|
||||
{
|
||||
for (var d = 0; d < directions.GetLength(0); d++)
|
||||
{
|
||||
var masCoordinates = CheckWord(r, c, directions[d, 0], directions[d, 1], grid, "MAS");
|
||||
if (masCoordinates != null)
|
||||
{
|
||||
masCenterCoordinates.Add($"{masCoordinates[1][0]},{masCoordinates[1][1]}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var masCountDict = masCenterCoordinates.GroupBy(item => item).ToDictionary(group => group.Key, group => group.Count()).Where(x => x.Value > 1);
|
||||
|
||||
return masCountDict.Count();
|
||||
}
|
||||
|
||||
int FindXmas(char[,] grid)
|
||||
{
|
||||
var rows = grid.GetLength(0);
|
||||
var cols = grid.GetLength(1);
|
||||
var xmasCount = 0;
|
||||
|
||||
var directions = new[,]
|
||||
{
|
||||
{ -1, 0 }, // up
|
||||
{ 0, 1 }, // right
|
||||
{ 0, -1 }, // left
|
||||
{ 1, 0 }, // down
|
||||
{ -1, 1 }, // diagonal up right
|
||||
{ 1, 1 }, // diagonal down right
|
||||
{ -1, -1 }, // diagonal up left
|
||||
{ 1, -1 } // diagonal down left
|
||||
};
|
||||
|
||||
for (var r = 0; r < rows; r++)
|
||||
{
|
||||
for (var c = 0; c < cols; c++)
|
||||
{
|
||||
for (var d = 0; d < directions.GetLength(0); d++)
|
||||
{
|
||||
if (CheckWord(r, c, directions[d, 0], directions[d, 1], grid, "XMAS") != null)
|
||||
{
|
||||
xmasCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return xmasCount;
|
||||
}
|
||||
|
||||
List<int[]>? CheckWord(int r, int c, int dr, int dc, char[,] grid, string word)
|
||||
{
|
||||
var characterCoordinates = new List<int[]>();
|
||||
|
||||
for (var i = 0; i < word.Length; i++)
|
||||
{
|
||||
var newR = r + i * dr;
|
||||
var newC = c + i * dc;
|
||||
if (!IsValid(newR, newC, grid) || grid[newR, newC] != word[i]) return null;
|
||||
|
||||
characterCoordinates.Add([newR, newC]);
|
||||
}
|
||||
|
||||
return characterCoordinates;
|
||||
}
|
||||
|
||||
bool IsValid(int r, int c, char[,] grid) => r >= 0 && r < grid.GetLength(0) && c >= 0 && c < grid.GetLength(1);
|
||||
Reference in New Issue
Block a user