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 searchDirections = 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 row = 0; row < rows; row++) { for (var column = 0; column < cols; column++) { for (var direction = 0; direction < searchDirections.GetLength(0); direction++) { var masCoordinates = CheckWord(row, column, searchDirections[direction, 0], searchDirections[direction, 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 searchDirections = 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 row = 0; row < rows; row++) { for (var column = 0; column < cols; column++) { for (var direction = 0; direction < searchDirections.GetLength(0); direction++) { if (CheckWord(row, column, searchDirections[direction, 0], searchDirections[direction, 1], grid, "XMAS") != null) { xmasCount++; } } } } return xmasCount; } List? CheckWord(int row, int column, int directionRow, int directionColumn, char[,] grid, string word) { var characterCoordinates = new List(); for (var i = 0; i < word.Length; i++) { var newRow = row + i * directionRow; var newColumn = column + i * directionColumn; if (!IsValid(newRow, newColumn, grid) || grid[newRow, newColumn] != word[i]) return null; characterCoordinates.Add([newRow, newColumn]); } return characterCoordinates; } bool IsValid(int row, int column, char[,] grid) => row >= 0 && row < grid.GetLength(0) && column >= 0 && column < grid.GetLength(1);