aboutsummaryrefslogtreecommitdiff
path: root/src/Day09.kt
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))
}