aboutsummaryrefslogtreecommitdiff
path: root/2021-kotlin/src/Day10.kt
diff options
context:
space:
mode:
Diffstat (limited to '2021-kotlin/src/Day10.kt')
-rw-r--r--2021-kotlin/src/Day10.kt91
1 files changed, 0 insertions, 91 deletions
diff --git a/2021-kotlin/src/Day10.kt b/2021-kotlin/src/Day10.kt
deleted file mode 100644
index d6d026c..0000000
--- a/2021-kotlin/src/Day10.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-object Day10 {
- private enum class ChunkDelimiter(val open: Char, val close: Char) {
- Parentheses('(', ')'),
- Brackets('[', ']'),
- Braces('{', '}'),
- Angled('<', '>');
-
- companion object {
- fun isOpening(character: Char): Boolean = values().any { it.open == character }
- fun isClosing(character: Char): Boolean = values().any { it.close == character }
- fun from(character: Char): ChunkDelimiter =
- values().find { it.open == character || it.close == character }!!
- }
- }
-
- private sealed class SyntaxError {
- object None : SyntaxError()
- class IncompleteLine(private val stack: ArrayDeque<ChunkDelimiter>) : SyntaxError() {
- val score: Long
- get() {
- fun delimiterValue(delimiter: ChunkDelimiter): Int = when (delimiter) {
- ChunkDelimiter.Parentheses -> 1
- ChunkDelimiter.Brackets -> 2
- ChunkDelimiter.Braces -> 3
- ChunkDelimiter.Angled -> 4
- }
-
- return stack.fold(0) { acc, elem -> acc * 5 + delimiterValue(elem) }
- }
- }
-
- class CorruptedLine(private val invalidDelimiter: ChunkDelimiter) : SyntaxError() {
- val score: Int
- get() = when (invalidDelimiter) {
- ChunkDelimiter.Parentheses -> 3
- ChunkDelimiter.Brackets -> 57
- ChunkDelimiter.Braces -> 1197
- ChunkDelimiter.Angled -> 25137
- }
- }
- }
-
- private fun parse(line: String): SyntaxError {
- val stack = ArrayDeque<ChunkDelimiter>()
-
- for (char in line) {
- when {
- ChunkDelimiter.isOpening(char) -> stack.addFirst(ChunkDelimiter.from(char))
- ChunkDelimiter.isClosing(char) -> {
- val closingDelimiter = ChunkDelimiter.from(char)
- if (stack.first() == closingDelimiter) {
- stack.removeFirst()
- } else {
- return SyntaxError.CorruptedLine(closingDelimiter)
- }
- }
- }
- }
-
- if (stack.isNotEmpty()) {
- return SyntaxError.IncompleteLine(stack)
- }
-
- return SyntaxError.None
- }
-
- fun part1(input: List<String>): Int = input
- .map { parse(it) }
- .filterIsInstance<SyntaxError.CorruptedLine>()
- .sumOf { it.score }
-
- fun part2(input: List<String>): Long =
- input
- .asSequence()
- .map { parse(it) }
- .filterIsInstance<SyntaxError.IncompleteLine>()
- .map { it.score }
- .sorted()
- .toList()
- .let { it[it.size / 2] }
-}
-
-fun main() {
- val testInput = readInputAsLines("Day10_test")
- check(Day10.part1(testInput) == 26397)
- check(Day10.part2(testInput) == 288957L)
-
- val input = readInputAsLines("Day10")
- println(Day10.part1(input))
- println(Day10.part2(input))
-}