blob: 9fef398d6696c468954d29f9aa7a3efa7827b3e1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
fun Map<Pos2D, Int>.getLowPoints(): Map<Pos2D, Int> =
filter { (pos, num) -> Pos2D.directions4.all { num < getOrDefault(pos + it, 9) } }
fun main() {
fun part1(input: List<String>): Int =
parseToMap(input).getLowPoints().values.sumOf { it + 1 }
fun part2(input: List<String>): Int {
val map = parseToMap(input)
fun traverseBasin(pos: Pos2D, acc: MutableSet<Pos2D>) {
acc.add(pos)
Pos2D.directions4
.map { pos + it }
.filter { !acc.contains(it) && map.getOrDefault(it, 9) < 9 }
.forEach { traverseBasin(it, acc) }
}
return map
.getLowPoints()
.map {
val visited = mutableSetOf<Pos2D>()
traverseBasin(it.key, visited)
visited.size
}
.sortedDescending()
.take(3)
.sum()
}
val testInput = readInputAsLines("Day09_test")
check(part1(testInput) == 15)
check(part2(testInput) == 1134)
val input = readInputAsLines("Day09")
println(part1(input))
println(part2(input))
}
|