Day 4: Ceres Search
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Kotlin
fun part1(input: String): Int { return countWordOccurrences(input.lines()) } fun part2(input: String): Int { val grid = input.lines().map(String::toList) var count = 0 for (row in 1..grid.size - 2) { for (col in 1..grid[row].size - 2) { if (grid[row][col] == 'A') { count += countCrossMatch(grid, row, col) } } } return count } private fun countCrossMatch(grid: List<List<Char>>, row: Int, col: Int): Int { val surroundingCorners = listOf( grid[row - 1][col - 1], // upper left grid[row - 1][col + 1], // upper right grid[row + 1][col - 1], // lower left grid[row + 1][col + 1], // lower right ) // no matches: // M S S M // A A // S M M S return if (surroundingCorners.count { it == 'M' } == 2 && surroundingCorners.count { it == 'S' } == 2 && surroundingCorners[0] != surroundingCorners[3] ) 1 else 0 } private fun countWordOccurrences(matrix: List<String>): Int { val rows = matrix.size val cols = if (rows > 0) matrix[0].length else 0 val directions = listOf( Pair(0, 1), // Horizontal right Pair(1, 0), // Vertical down Pair(1, 1), // Diagonal down-right Pair(1, -1), // Diagonal down-left Pair(0, -1), // Horizontal left Pair(-1, 0), // Vertical up Pair(-1, -1), // Diagonal up-left Pair(-1, 1) // Diagonal up-right ) fun isWordAt(row: Int, col: Int, word: String, direction: Pair<Int, Int>): Boolean { val (dx, dy) = direction for (i in word.indices) { val x = row + i * dx val y = col + i * dy if (x !in 0 until rows || y !in 0 until cols || matrix[x][y] != word[i]) { return false } } return true } var count = 0 for (row in 0 until rows) { for (col in 0 until cols) { for (direction in directions) { if (isWordAt(row, col, "XMAS", direction)) { count++ } } } } return count }