aboutsummaryrefslogtreecommitdiff
path: root/aoc-2021-kotlin/src/Day09.kt
blob: 9d0c41da8d2dae18b0372f90bd559fb61f9a1c45 (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
40
object Day09 {
    private fun Map<Pos2D, Int>.getLowPoints() =
        filter { (pos, num) -> Pos2D.directions4.all { num < getOrDefault(pos + it, 9) } }

    fun part1(input: List<String>) =
        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()
    }
}

fun main() {
    val testInput = readInputAsLines("Day09_test")
    check(Day09.part1(testInput) == 15)
    check(Day09.part2(testInput) == 1134)

    val input = readInputAsLines("Day09")
    println(Day09.part1(input))
    println(Day09.part2(input))
}