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 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? CheckWord(int r, int c, int dr, int dc, char[,] grid, string word) { var characterCoordinates = new List(); 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);