aboutsummaryrefslogtreecommitdiff
path: root/aoc-2021-kotlin/src/Day09.kt
diff options
context:
space:
mode:
authortchojnacki <tomaszchojnacki2001@gmail.com>2022-08-11 19:24:23 +0200
committertchojnacki <tomaszchojnacki2001@gmail.com>2022-08-11 19:24:23 +0200
commit0f1e145b80813ae2331b7dac5ace0c589654ad2a (patch)
tree25483b8239436dd5aed2fee8811caf0ba893c0bb /aoc-2021-kotlin/src/Day09.kt
parent85fb0396bed6a2129b12392941103924b1ab55be (diff)
downloadgleam_aoc2020-0f1e145b80813ae2331b7dac5ace0c589654ad2a.tar.gz
gleam_aoc2020-0f1e145b80813ae2331b7dac5ace0c589654ad2a.zip
Move subproject to avoid IntelliJ module name issues
Diffstat (limited to 'aoc-2021-kotlin/src/Day09.kt')
-rw-r--r--aoc-2021-kotlin/src/Day09.kt40
1 files changed, 40 insertions, 0 deletions
diff --git a/aoc-2021-kotlin/src/Day09.kt b/aoc-2021-kotlin/src/Day09.kt
new file mode 100644
index 0000000..9d0c41d
--- /dev/null
+++ b/aoc-2021-kotlin/src/Day09.kt
@@ -0,0 +1,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))
+}