-
Notifications
You must be signed in to change notification settings - Fork 0
/
Day10.kt
30 lines (27 loc) · 1.16 KB
/
Day10.kt
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
package com.github.ephemient.aoc2021
/** [Day 10](https://adventofcode.com/2021/day/10): Syntax Scoring */
class Day10(private val lines: List<String>) {
fun part1(): Int = lines.sumOf { line ->
val expected = mutableListOf<Char>()
for (char in line) {
pairs[char]?.also { expected += it }
?: expected.removeLastOrNull()?.takeIf { it == char }
?: return@sumOf part1Points.getValue(char)
}
0
}
fun part2(): Long = lines.mapNotNullTo(mutableListOf()) { line ->
val expected = mutableListOf<Char>()
for (char in line) {
pairs[char]?.also { expected += it }
?: expected.removeLastOrNull()?.takeIf { it == char }
?: return@mapNotNullTo null
}
expected.asReversed().fold(0L) { acc, char -> 5 * acc + part2Points.getValue(char) }
}.apply { sort() }.let { it[it.size / 2] }
companion object {
private val pairs = "([{<".zip(")]}>").toMap()
private val part1Points = mapOf(')' to 3, ']' to 57, '}' to 1197, '>' to 25137)
private val part2Points = mapOf(')' to 1, ']' to 2, '}' to 3, '>' to 4)
}
}