aoc_2024/day10.kts

82 lines
2.3 KiB
Plaintext
Raw Permalink Normal View History

2024-12-11 13:17:25 +00:00
#!/usr/bin/env kotlin
import java.util.Scanner
2024-12-12 14:36:47 +00:00
class TrailHead(private val x: Int, private val y: Int, private val map: Map) {
private val peaks = mutableMapOf<Pair<Int, Int>, Int>()
fun getScore(): Int {
if (this.peaks.isEmpty()) {
for (peak in this.walkToPeak(this.x, this.y)) {
this.peaks[peak] = (this.peaks[peak] ?: 0) + 1
2024-12-11 13:17:25 +00:00
}
}
2024-12-12 14:36:47 +00:00
return this.peaks.keys.size
}
fun getGetRating(): Int {
this.getScore()
return this.peaks.values.sum()
}
2024-12-11 13:17:25 +00:00
2024-12-12 14:36:47 +00:00
private fun walkToPeak(x: Int, y: Int, previous: Int = -1): List<Pair<Int, Int>> {
if (x < 0 || x >= map.getLength() || y < 0 || y >= map.getHeight() || map.get(x, y) != (previous + 1)) {
return listOf()
} else if (map.get(x, y) == 9) {
return listOf(Pair(x, y))
} else {
val current = map.get(x, y)
return walkToPeak(x + 1, y, current) + walkToPeak(x - 1, y, current) + walkToPeak(x, y + 1, current) + walkToPeak(x, y - 1, current)
2024-12-11 13:17:25 +00:00
}
}
2024-12-12 14:36:47 +00:00
}
class Map(private val grid: List<List<Int>>) {
private val trailHeads = mutableListOf<TrailHead>()
2024-12-11 13:17:25 +00:00
2024-12-12 14:36:47 +00:00
init {
grid.forEachIndexed { y, row ->
row.forEachIndexed { x, height ->
if (height == 0) {
trailHeads.add(TrailHead(x, y, this))
2024-12-11 13:17:25 +00:00
}
}
}
2024-12-12 14:36:47 +00:00
}
2024-12-11 13:17:25 +00:00
2024-12-12 14:36:47 +00:00
fun addTrailHead(trailHead: TrailHead) {
trailHeads.add(trailHead)
}
2024-12-11 13:17:25 +00:00
2024-12-12 14:36:47 +00:00
fun get(x: Int, y: Int): Int {
return grid[y][x]
}
2024-12-11 13:17:25 +00:00
2024-12-12 14:36:47 +00:00
fun getHeight(): Int {
return grid.size
}
2024-12-11 13:17:25 +00:00
2024-12-12 14:36:47 +00:00
fun getLength(): Int {
return if (grid.isNotEmpty()) grid[0].size else 0
}
2024-12-11 13:17:25 +00:00
2024-12-12 14:36:47 +00:00
fun getScore(): Int {
return trailHeads.fold(0) { acc, trailHead -> acc + trailHead.getScore() }
}
2024-12-11 13:17:25 +00:00
2024-12-12 14:36:47 +00:00
fun getGetRating(): Int {
return trailHeads.fold(0) { acc, trailHead -> acc + trailHead.getGetRating() }
2024-12-11 13:17:25 +00:00
}
2024-12-12 14:36:47 +00:00
}
2024-12-11 13:17:25 +00:00
val scanner = Scanner(System.`in`)
val mapInput = mutableListOf<List<Int>>()
while (scanner.hasNext()) {
val line = scanner.nextLine()
val numbers = line.split("").filter { it.isNotEmpty() }.map { it.toInt() }
mapInput.add(numbers)
}
val map = Map(mapInput.reversed())
println("Score: ${map.getScore()}")
println("Rating: ${map.getGetRating()}")