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
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
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
}