From 7d8db7b493ae088d1c8e22490092556497cf8b72 Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Tue, 8 Dec 2020 07:30:51 +0100 Subject: [PATCH] Day08 --- days/src/main/kotlin/Day08.kt | 71 ++++ days/src/main/resources/day08.txt | 649 ++++++++++++++++++++++++++++++ 2 files changed, 720 insertions(+) create mode 100644 days/src/main/kotlin/Day08.kt create mode 100644 days/src/main/resources/day08.txt diff --git a/days/src/main/kotlin/Day08.kt b/days/src/main/kotlin/Day08.kt new file mode 100644 index 0000000..d3891c3 --- /dev/null +++ b/days/src/main/kotlin/Day08.kt @@ -0,0 +1,71 @@ +package be.vandewalleh.aoc.days + +import be.vandewalleh.aoc.utils.input.Day +import be.vandewalleh.aoc.utils.input.Input +import be.vandewalleh.aoc.utils.input.Lines +import be.vandewalleh.aoc.utils.input.createDay +import org.eclipse.collections.impl.factory.primitive.IntLists +import org.eclipse.collections.impl.factory.primitive.IntSets + +@Day(8) +class Day08(@Lines val input: Input>) { + + private val instructions = input.value + .map { + val words = it.split(" ") + Instruction(Operation.valueOf(words[0].capitalize()), words[1].toInt()) + }.toTypedArray() + + fun part1() = run(instructions) + + private fun run(mutatedInstructions: Array): Int { + var acc = 0 + var ptr = 0 + + val visited = IntSets.mutable.empty() + + while (visited.add(ptr)) { + val instruction = mutatedInstructions[ptr] + when (instruction.operation) { + Operation.Acc -> { + acc += instruction.argument + ptr++ + } + Operation.Jmp -> ptr += instruction.argument + Operation.Nop -> ptr++ + } + if (ptr !in mutatedInstructions.indices) { + println(acc) + error("oob") + } + } + + return acc + } + + fun part2() { + val possibleMutations = IntLists.mutable.empty() + instructions.forEachIndexed { i, e -> + if (e.operation != Operation.Acc) possibleMutations.add(i) + } + + possibleMutations.forEach { index -> + val copy = instructions.clone().also { + val modifiedOperation = if (it[index].operation == Operation.Nop) Operation.Jmp else Operation.Nop + it[index] = it[index].copy(operation = modifiedOperation) + } + run(copy) + } + } + +} + +enum class Operation { Acc, Jmp, Nop } + +data class Instruction(val operation: Operation, val argument: Int) + +fun main() { + val day = createDay() + println(day.part1()) + println(day.part2()) +} diff --git a/days/src/main/resources/day08.txt b/days/src/main/resources/day08.txt new file mode 100644 index 0000000..8e0584a --- /dev/null +++ b/days/src/main/resources/day08.txt @@ -0,0 +1,649 @@ +acc +7 +acc +23 +acc +41 +jmp +173 +acc -17 +acc +42 +acc +31 +jmp +349 +jmp +1 +jmp +252 +nop +574 +jmp +298 +acc +45 +acc +7 +jmp +338 +nop +5 +nop +528 +jmp +547 +jmp +313 +jmp +387 +acc +43 +acc +48 +acc +38 +jmp +45 +jmp +438 +acc +15 +acc +21 +acc +25 +acc +25 +jmp +168 +jmp -5 +acc +49 +acc +43 +jmp +99 +acc -8 +acc +16 +acc -7 +jmp +513 +jmp +484 +jmp +270 +nop +422 +acc -4 +nop +242 +jmp +1 +jmp +11 +nop +122 +nop +263 +acc +2 +jmp +474 +jmp +501 +nop +38 +acc -7 +acc +0 +nop +85 +jmp +496 +acc +11 +acc -13 +acc +40 +acc +29 +jmp +519 +jmp +409 +acc +41 +jmp +1 +acc -17 +jmp +16 +nop +485 +acc -7 +jmp +58 +acc +16 +acc +1 +jmp +123 +jmp +157 +acc +43 +jmp +422 +jmp +1 +acc -19 +acc +48 +jmp +80 +jmp +500 +jmp -59 +acc +34 +acc +11 +jmp +75 +nop +467 +acc -16 +acc +9 +acc +32 +jmp -69 +acc -13 +jmp +422 +jmp +96 +acc -10 +acc -19 +jmp -68 +acc +31 +nop +102 +acc +25 +jmp +140 +acc +34 +acc +45 +acc -9 +acc -17 +jmp -34 +nop +262 +jmp +236 +acc +0 +acc +32 +jmp +269 +acc +16 +jmp +1 +jmp +382 +jmp -39 +acc +45 +nop +166 +nop +408 +acc +10 +jmp +379 +jmp +1 +acc +44 +jmp +249 +nop +334 +acc +36 +nop +442 +acc +5 +jmp +440 +acc +0 +acc +44 +jmp +432 +acc +48 +acc +4 +acc +50 +jmp +355 +acc +31 +jmp +1 +acc +46 +nop -74 +jmp +33 +jmp +91 +nop +463 +acc +41 +nop -2 +jmp +132 +acc +41 +acc +43 +acc +28 +jmp -65 +acc -17 +acc +33 +jmp +183 +acc +11 +jmp +181 +jmp +450 +acc -18 +acc -2 +acc +44 +nop +416 +jmp +108 +acc -18 +acc +12 +acc -1 +acc -19 +jmp +321 +acc +50 +acc -17 +jmp +1 +nop +161 +jmp -41 +jmp +52 +jmp +84 +acc +11 +acc +19 +acc +40 +jmp +293 +acc +29 +jmp +1 +jmp +311 +nop +91 +acc +1 +acc +0 +acc +16 +jmp -42 +acc +0 +acc -16 +acc +41 +nop +348 +jmp -39 +nop -114 +nop +320 +acc +46 +acc -1 +jmp +55 +nop +278 +jmp -94 +acc +47 +jmp +365 +acc +44 +jmp -58 +jmp +1 +jmp +114 +acc -13 +acc -5 +acc +12 +jmp +183 +nop +237 +acc +26 +acc +49 +acc +1 +jmp -189 +acc +7 +acc +2 +jmp -190 +acc -17 +acc +18 +acc -1 +jmp -47 +nop -39 +acc -18 +nop +354 +jmp +264 +acc +46 +jmp +179 +acc +22 +acc +24 +jmp +309 +acc +45 +acc -9 +jmp -206 +jmp +34 +nop +254 +acc +9 +acc +32 +jmp +391 +acc +9 +acc +20 +acc +7 +acc +48 +jmp -85 +acc +27 +acc -3 +jmp +146 +acc -12 +acc +37 +acc +23 +jmp +1 +jmp +48 +acc +46 +jmp +99 +acc -12 +acc -2 +acc +49 +jmp +1 +jmp +293 +jmp +1 +acc +38 +jmp +13 +jmp -215 +jmp -145 +acc +7 +nop +73 +nop +189 +jmp +167 +jmp +332 +acc +29 +jmp -146 +jmp +198 +acc +10 +jmp +342 +acc +31 +jmp -136 +acc +16 +acc +33 +acc +26 +jmp -48 +acc +14 +jmp +91 +acc -15 +nop +274 +acc -2 +jmp -75 +acc +14 +acc +21 +acc +4 +jmp +332 +jmp -243 +acc +25 +acc -5 +jmp +250 +acc -17 +acc +32 +acc +28 +acc +34 +jmp -80 +acc +23 +acc +30 +acc +10 +nop -98 +jmp -205 +acc -16 +acc -15 +acc +49 +acc +15 +jmp +11 +nop +97 +acc -2 +acc +31 +jmp +1 +jmp -130 +acc +25 +jmp +129 +nop -231 +jmp +274 +jmp -280 +acc +0 +acc -14 +acc +8 +nop -224 +jmp +328 +acc +6 +acc +29 +acc +9 +jmp -229 +acc +8 +jmp -284 +acc +4 +acc +0 +jmp -200 +acc +18 +acc +33 +jmp -76 +acc -2 +jmp +139 +nop -70 +acc -6 +acc +9 +jmp -25 +nop +21 +acc +37 +acc +15 +acc +45 +jmp +130 +acc +45 +acc -5 +jmp -86 +acc -15 +jmp +55 +nop -305 +acc +24 +jmp -275 +jmp +1 +acc +31 +acc -19 +jmp -148 +acc +27 +jmp +279 +acc +11 +jmp +253 +acc +17 +nop -1 +acc -15 +jmp -57 +acc +12 +acc +10 +acc -7 +acc +18 +jmp -100 +acc +39 +jmp -180 +jmp +155 +acc -14 +acc -10 +acc -14 +nop -202 +jmp -267 +acc +11 +acc +0 +jmp -130 +acc +19 +acc -18 +jmp +166 +jmp +61 +jmp +13 +acc -2 +jmp +1 +acc +19 +jmp -160 +acc +23 +jmp +1 +acc +37 +acc +40 +jmp +86 +acc +17 +acc -18 +jmp -195 +acc +11 +nop -149 +acc -13 +jmp +41 +acc -16 +jmp -30 +acc +34 +acc +13 +acc +38 +jmp +46 +acc -13 +acc +34 +jmp -273 +acc -9 +acc -8 +acc +23 +acc +8 +jmp +82 +acc +3 +acc +43 +nop +137 +jmp -46 +acc -15 +acc +41 +acc +25 +acc +3 +jmp -208 +acc +0 +jmp -169 +acc +20 +acc +12 +jmp -221 +acc -14 +jmp +96 +acc +47 +acc +25 +acc +7 +jmp +141 +acc -19 +jmp -294 +acc +28 +jmp -94 +acc +35 +jmp +33 +jmp -349 +acc -17 +jmp +193 +jmp +1 +acc -16 +jmp -169 +jmp +1 +nop -258 +acc +44 +nop -13 +jmp -330 +jmp +189 +acc +20 +acc +31 +nop +35 +acc +42 +jmp +64 +acc +9 +nop -406 +acc -14 +jmp +1 +jmp +74 +acc +34 +acc +0 +jmp -285 +jmp -422 +nop -338 +jmp +47 +nop -445 +jmp -145 +jmp +1 +jmp -116 +acc +41 +acc +44 +acc +34 +jmp -146 +acc +44 +jmp -434 +acc +44 +acc +34 +jmp -185 +acc -17 +nop -187 +nop -5 +jmp -96 +nop -20 +jmp -199 +acc +33 +jmp -229 +nop +50 +jmp -263 +acc -5 +acc -4 +acc +16 +jmp -340 +jmp -77 +nop -71 +jmp -168 +acc -18 +nop -447 +nop -479 +jmp -118 +acc +49 +nop -35 +jmp -264 +acc +21 +jmp -76 +acc +25 +acc +46 +jmp -339 +jmp -382 +nop -54 +nop -169 +jmp -208 +acc -8 +jmp -395 +acc -8 +acc +45 +nop -312 +jmp +92 +jmp -31 +acc +45 +acc +42 +nop -259 +jmp -169 +nop -255 +nop -69 +acc +47 +acc +35 +jmp -428 +acc +15 +acc +47 +acc +50 +acc +13 +jmp -491 +jmp -386 +acc +32 +acc +36 +jmp -73 +acc +22 +acc +0 +acc +35 +jmp -531 +acc +21 +nop -365 +acc +16 +jmp +89 +acc +50 +jmp -467 +acc +42 +nop -167 +acc +39 +jmp -481 +acc -13 +acc +49 +acc +8 +acc -11 +jmp -47 +acc +22 +acc +23 +nop +14 +jmp +56 +jmp -57 +acc +0 +acc +45 +acc -12 +jmp -339 +acc +41 +jmp -286 +acc +24 +acc -14 +acc +7 +nop -481 +jmp -539 +acc +14 +jmp -511 +acc +1 +acc -14 +jmp +1 +acc -12 +jmp -123 +acc -17 +acc +11 +jmp -16 +nop -148 +acc -14 +jmp -485 +nop -258 +nop -123 +acc +22 +jmp -359 +nop -527 +nop -443 +acc +43 +jmp +1 +jmp -406 +acc +39 +acc +13 +acc +3 +acc -5 +jmp -585 +acc +41 +acc +26 +jmp -83 +acc +30 +acc +8 +acc +36 +jmp -150 +acc +36 +acc +43 +jmp -305 +acc +10 +acc +33 +jmp -188 +nop -285 +acc -4 +jmp -385 +acc -1 +jmp +1 +nop -23 +jmp -471 +acc +24 +acc +16 +acc +29 +jmp -114 +nop -471 +acc +4 +nop -360 +nop -294 +jmp -220 +acc -18 +acc +21 +acc +10 +acc +0 +jmp -166 +jmp -192 +acc +37 +acc +24 +nop -198 +jmp -425 +acc -19 +acc +43 +jmp -608 +acc +17 +acc +32 +acc +0 +jmp -424 +acc +50 +acc +46 +nop -555 +acc -16 +jmp +1