From 91e5a765ec66409b0625c187b973eccb92890cbf Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Fri, 10 Dec 2021 06:29:11 +0100 Subject: [PATCH] day(10): add solution Signed-off-by: Matej Focko --- src/year2021/day10/Day10.kt | 74 +++++++++++++++++++++++++++++++++++ src/year2021/day10/sample.txt | 10 +++++ 2 files changed, 84 insertions(+) create mode 100644 src/year2021/day10/Day10.kt create mode 100644 src/year2021/day10/sample.txt diff --git a/src/year2021/day10/Day10.kt b/src/year2021/day10/Day10.kt new file mode 100644 index 0000000..ead3a24 --- /dev/null +++ b/src/year2021/day10/Day10.kt @@ -0,0 +1,74 @@ +package year2021.day10 + +import readInput + +val CLOSING: Map = mapOf( + ')' to '(', + ']' to '[', + '}' to '{', + '>' to '<' +) +val ERROR_SCORING: Map = mapOf(')' to 3, ']' to 57, '}' to 1197, '>' to 25137) +val AUTOCOMPLETE_SCORING: Map = mapOf( + '(' to 1, + '[' to 2, + '{' to 3, + '<' to 4 +) + +fun firstInvalid(input: String): Char? { + val stack = mutableListOf() + + for (c in input) { + if (CLOSING.contains(c)) { + // found a closing one + if (stack.size < 1 || stack.last() != CLOSING[c]) { + return c + } + stack.removeLast() + } else { + stack.add(c) + } + } + return null +} + +fun part1(input: List): Int = input.sumOf { + firstInvalid(it)?.let { c -> + ERROR_SCORING[c] + } ?: 0 +} + +fun getRemaining(input: String): List { + val stack = mutableListOf() + + for (c in input) { + if (CLOSING.contains(c)) { + stack.removeLast() + } else { + stack.add(c) + } + } + + return stack +} + +fun part2(input: List): Long = input + .filter { firstInvalid(it) == null } + .map { + getRemaining(it).reversed().fold(0.toLong()) { total, c -> 5 * total + AUTOCOMPLETE_SCORING[c]!! } + } + .sorted().let { scores -> + scores[scores.size / 2] + } + +fun main() { + val sample = readInput(10, "sample") + val input = readInput(10, "input") + + check(part1(sample) == 26397) + println(part1(input)) + + check(part2(sample) == 288957.toLong()) + println(part2(input)) +} diff --git a/src/year2021/day10/sample.txt b/src/year2021/day10/sample.txt new file mode 100644 index 0000000..2f182d8 --- /dev/null +++ b/src/year2021/day10/sample.txt @@ -0,0 +1,10 @@ +[({(<(())[]>[[{[]{<()<>> +[(()[<>])]({[<{<<[]>>( +{([(<{}[<>[]}>{[]{[(<()> +(((({<>}<{<{<>}{[]{[]{} +[[<[([]))<([[{}[[()]]] +[{[{({}]{}}([{[{{{}}([] +{<[[]]>}<{[{[{[]{()[[[] +[<(<(<(<{}))><([]([]() +<{([([[(<>()){}]>(<<{{ +<{([{{}}[<[[[<>{}]]]>[]] \ No newline at end of file