Created
January 22, 2021 12:15
-
-
Save eugene70/beadf4c30a9f9f67c6ce8a3780f99208 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package aoc2020 | |
object Day08: | |
object Op extends Enumeration: | |
val NOP: Op.Value = Value("nop") | |
val ACC: Op.Value = Value("acc") | |
val JMP: Op.Value = Value("jmp") | |
implicit class Executor(op: Value): | |
def execute(acc: Int, line: Int, operand: Int): (Int, Int) = | |
op match | |
case NOP => (acc, line + 1) | |
case ACC => (acc + operand, line + 1) | |
case JMP => (acc, line + operand) | |
type InputType = List[(Op.Value, Int)] | |
class Vm(implicit codes: InputType): | |
def run(implicit codes: InputType): (Boolean, Int) = | |
var executedLines: Seq[Int] = Seq() | |
var line = 0 | |
var acc = 0 | |
while (line < codes.length && !executedLines.contains(line)) { | |
executedLines = executedLines :+ line | |
val r = Op.Executor(codes(line)._1).execute(acc, line, codes(line)._2) | |
acc = r._1 | |
line = r._2 | |
} | |
(line == codes.length, acc) | |
def debug: (Boolean, Int) = | |
for (line <- codes.indices) { | |
val c = codes(line) match { | |
case (Op.JMP, opr) => codes.updated(line, (Op.NOP, opr)) | |
case (Op.NOP, opr) => codes.updated(line, (Op.JMP, opr)) | |
case _ => codes | |
} | |
if (c != codes) { | |
val r = run(c) | |
if (r._1) { | |
return r | |
} | |
} | |
} | |
(false, 0) | |
@main def day08: Unit = | |
val testData = time("testReady", () => ready(testInput)) | |
time("tesPart1", () => part1(testData)) // should be 5 | |
time("testPart2", () => part2(testData)) // should be 8 | |
val data = time("ready", () => ready(input)) | |
time("part1", () => part1(data)) | |
time("part2", () => part2(data)) | |
private def ready(input: String): InputType = | |
input | |
.linesIterator | |
.map(line => line.split(' ')) | |
.map(a => (Op.withName(a(0)), Integer.parseInt(a(1)))) | |
.toList | |
private def part1(implicit data: InputType): (Boolean, Int) = | |
val vm = new Vm | |
vm.run | |
private def part2(implicit data: InputType): (Boolean, Int) = | |
val vm = new Vm | |
vm.debug | |
private val testInput = | |
"""nop +0 | |
|acc +1 | |
|jmp +4 | |
|acc +3 | |
|jmp -3 | |
|acc -99 | |
|acc +1 | |
|jmp -4 | |
|acc +6 | |
|""".stripMargin | |
private val input = | |
"""acc +8 | |
|nop +139 | |
|nop +383 | |
|jmp +628 | |
|acc -6 | |
|acc +29 | |
|acc +9 | |
|jmp +457 | |
|acc +29 | |
|acc +38 | |
|nop +451 | |
|jmp +44 | |
|acc +24 | |
|nop +260 | |
|acc +20 | |
|jmp +24 | |
|acc +36 | |
|acc +41 | |
|acc +31 | |
|acc +42 | |
|jmp +35 | |
|acc +21 | |
|nop +216 | |
|acc +7 | |
|jmp +42 | |
|nop +408 | |
|acc +18 | |
|acc -4 | |
|jmp +532 | |
|acc -8 | |
|acc +13 | |
|jmp +529 | |
|acc +36 | |
|jmp +257 | |
|acc +26 | |
|acc +24 | |
|acc -11 | |
|nop +508 | |
|jmp +249 | |
|acc +44 | |
|acc +25 | |
|jmp +464 | |
|acc +47 | |
|jmp +318 | |
|acc -6 | |
|acc -1 | |
|jmp +175 | |
|acc +19 | |
|acc +25 | |
|acc +24 | |
|jmp +523 | |
|acc -7 | |
|acc +45 | |
|jmp +353 | |
|jmp +67 | |
|acc -1 | |
|jmp -17 | |
|acc -9 | |
|jmp +180 | |
|acc +19 | |
|acc -15 | |
|acc +5 | |
|jmp +52 | |
|nop +312 | |
|acc +38 | |
|jmp -6 | |
|acc +6 | |
|acc -11 | |
|acc -6 | |
|jmp +357 | |
|jmp +455 | |
|acc +27 | |
|acc +29 | |
|acc +9 | |
|nop +414 | |
|jmp +380 | |
|jmp +1 | |
|acc +33 | |
|jmp +47 | |
|acc +12 | |
|acc +34 | |
|acc -9 | |
|acc +17 | |
|jmp +214 | |
|jmp +125 | |
|acc +38 | |
|acc +38 | |
|acc +16 | |
|jmp +310 | |
|acc +9 | |
|acc +10 | |
|acc -2 | |
|nop -84 | |
|jmp +329 | |
|nop +120 | |
|nop -70 | |
|jmp -88 | |
|jmp +1 | |
|jmp +1 | |
|acc +23 | |
|jmp -34 | |
|nop +372 | |
|acc +18 | |
|acc +3 | |
|acc +24 | |
|jmp -50 | |
|acc -11 | |
|acc +27 | |
|nop +441 | |
|jmp +443 | |
|acc +44 | |
|acc -3 | |
|acc +7 | |
|jmp +389 | |
|acc -5 | |
|acc +36 | |
|acc -17 | |
|acc +15 | |
|jmp +13 | |
|acc +39 | |
|jmp +407 | |
|acc +8 | |
|acc +21 | |
|jmp +360 | |
|jmp +425 | |
|acc +7 | |
|acc +29 | |
|acc +6 | |
|jmp +10 | |
|jmp +1 | |
|jmp +426 | |
|acc +23 | |
|jmp +3 | |
|nop +2 | |
|jmp +1 | |
|jmp +240 | |
|acc +16 | |
|jmp -2 | |
|jmp +47 | |
|jmp +488 | |
|jmp +1 | |
|acc +45 | |
|jmp +1 | |
|acc +20 | |
|jmp +344 | |
|jmp +407 | |
|acc +2 | |
|acc +3 | |
|jmp +117 | |
|acc +50 | |
|jmp -134 | |
|acc +1 | |
|jmp +238 | |
|acc +27 | |
|acc -11 | |
|acc +16 | |
|nop +134 | |
|jmp +116 | |
|acc -16 | |
|nop +393 | |
|jmp +2 | |
|jmp +24 | |
|nop +98 | |
|acc +36 | |
|acc +0 | |
|nop +268 | |
|jmp +131 | |
|nop +294 | |
|acc +23 | |
|acc +26 | |
|acc +43 | |
|jmp +358 | |
|nop +316 | |
|jmp +300 | |
|acc +22 | |
|acc +47 | |
|acc +19 | |
|acc +2 | |
|jmp +228 | |
|jmp +176 | |
|acc -4 | |
|acc +20 | |
|nop +83 | |
|acc -19 | |
|jmp -99 | |
|acc +39 | |
|nop +374 | |
|acc +3 | |
|jmp +57 | |
|jmp +1 | |
|acc +42 | |
|jmp +404 | |
|acc +4 | |
|acc -4 | |
|acc -10 | |
|nop +293 | |
|jmp +349 | |
|acc -9 | |
|acc +33 | |
|jmp +284 | |
|nop +1 | |
|acc +18 | |
|acc -1 | |
|acc -5 | |
|jmp +411 | |
|acc +4 | |
|acc -6 | |
|acc +16 | |
|jmp +313 | |
|acc +0 | |
|acc +39 | |
|jmp +3 | |
|acc -13 | |
|jmp +148 | |
|nop +51 | |
|nop -207 | |
|nop +357 | |
|acc -19 | |
|jmp +409 | |
|acc +32 | |
|jmp +103 | |
|acc +5 | |
|jmp +116 | |
|nop +399 | |
|acc +19 | |
|acc +39 | |
|nop +78 | |
|jmp +298 | |
|acc -16 | |
|acc +31 | |
|jmp +1 | |
|acc +45 | |
|jmp -207 | |
|acc +6 | |
|acc +36 | |
|acc +34 | |
|acc +47 | |
|jmp -112 | |
|acc +23 | |
|acc +4 | |
|jmp +289 | |
|acc -17 | |
|nop +307 | |
|nop -92 | |
|jmp -146 | |
|jmp +293 | |
|nop +44 | |
|acc +5 | |
|acc +2 | |
|acc -19 | |
|jmp +172 | |
|acc +10 | |
|acc +49 | |
|acc -2 | |
|jmp +6 | |
|acc +3 | |
|jmp +1 | |
|acc -19 | |
|acc +35 | |
|jmp +328 | |
|acc +38 | |
|acc -5 | |
|nop -83 | |
|jmp -138 | |
|jmp -55 | |
|acc +35 | |
|jmp +1 | |
|jmp -216 | |
|nop +220 | |
|jmp +116 | |
|jmp -78 | |
|nop +331 | |
|jmp +118 | |
|jmp +287 | |
|jmp -258 | |
|jmp -181 | |
|nop +85 | |
|acc +31 | |
|acc +10 | |
|acc -13 | |
|jmp +175 | |
|jmp +66 | |
|acc +34 | |
|acc +6 | |
|nop -126 | |
|acc +38 | |
|jmp +4 | |
|acc +18 | |
|jmp -13 | |
|jmp -8 | |
|jmp +1 | |
|acc -9 | |
|acc +31 | |
|nop +92 | |
|jmp +118 | |
|nop +21 | |
|jmp +110 | |
|acc +20 | |
|acc +20 | |
|jmp +280 | |
|jmp -142 | |
|jmp +8 | |
|nop -286 | |
|jmp +170 | |
|acc +22 | |
|acc +29 | |
|nop -127 | |
|jmp +36 | |
|jmp +328 | |
|acc +27 | |
|jmp -110 | |
|acc +28 | |
|acc +44 | |
|acc +34 | |
|acc +43 | |
|jmp -42 | |
|acc -19 | |
|jmp +185 | |
|acc -8 | |
|nop -3 | |
|acc +31 | |
|acc -11 | |
|jmp +142 | |
|acc +49 | |
|acc -2 | |
|acc +28 | |
|acc +17 | |
|jmp +167 | |
|acc +16 | |
|jmp +165 | |
|jmp -190 | |
|jmp -117 | |
|acc +0 | |
|acc +16 | |
|jmp +1 | |
|acc -10 | |
|jmp -39 | |
|jmp +69 | |
|jmp -187 | |
|nop -101 | |
|jmp +1 | |
|acc +12 | |
|jmp +218 | |
|acc -6 | |
|jmp -300 | |
|acc +10 | |
|jmp +104 | |
|jmp +1 | |
|acc +36 | |
|jmp -243 | |
|nop +138 | |
|acc -15 | |
|acc +13 | |
|nop +278 | |
|jmp -192 | |
|acc +13 | |
|jmp +275 | |
|acc +0 | |
|nop +92 | |
|nop +214 | |
|jmp -90 | |
|acc +44 | |
|nop +225 | |
|acc +9 | |
|jmp -348 | |
|acc +16 | |
|jmp -334 | |
|nop -335 | |
|acc -16 | |
|acc -9 | |
|jmp -89 | |
|acc +35 | |
|acc +2 | |
|acc +26 | |
|jmp +68 | |
|acc -19 | |
|acc +14 | |
|acc -19 | |
|acc -19 | |
|jmp +262 | |
|acc -16 | |
|nop -246 | |
|nop -251 | |
|acc +26 | |
|jmp +143 | |
|nop +48 | |
|acc +48 | |
|jmp +249 | |
|acc -8 | |
|jmp +9 | |
|acc +42 | |
|acc +12 | |
|acc +19 | |
|acc -4 | |
|jmp +213 | |
|acc +1 | |
|acc +29 | |
|jmp -259 | |
|acc +3 | |
|acc +17 | |
|acc -13 | |
|jmp -131 | |
|acc +16 | |
|acc -9 | |
|acc +28 | |
|jmp +222 | |
|acc +42 | |
|acc +20 | |
|acc -3 | |
|acc +50 | |
|jmp -339 | |
|jmp +1 | |
|acc +1 | |
|nop -315 | |
|acc +44 | |
|acc +50 | |
|jmp -143 | |
|nop -87 | |
|nop +155 | |
|jmp +1 | |
|nop +44 | |
|jmp +158 | |
|nop -10 | |
|acc +9 | |
|jmp +90 | |
|jmp +89 | |
|acc +27 | |
|acc -5 | |
|acc -8 | |
|acc +40 | |
|jmp +3 | |
|nop -360 | |
|jmp +117 | |
|acc -14 | |
|acc -16 | |
|nop -184 | |
|acc +20 | |
|jmp +185 | |
|acc -2 | |
|acc +36 | |
|nop +24 | |
|jmp +195 | |
|acc -8 | |
|acc -3 | |
|acc +7 | |
|jmp -84 | |
|acc +0 | |
|acc -12 | |
|acc +43 | |
|jmp -270 | |
|nop -434 | |
|acc -15 | |
|jmp +163 | |
|acc +14 | |
|jmp +29 | |
|acc +32 | |
|acc +26 | |
|acc +13 | |
|jmp -91 | |
|acc +30 | |
|jmp -163 | |
|nop +175 | |
|jmp -175 | |
|jmp +20 | |
|acc +0 | |
|nop -426 | |
|acc +22 | |
|acc -6 | |
|jmp -83 | |
|acc +12 | |
|acc +43 | |
|acc +31 | |
|jmp -46 | |
|acc +27 | |
|acc +26 | |
|acc +24 | |
|acc -12 | |
|jmp +118 | |
|nop -88 | |
|nop -251 | |
|acc -15 | |
|acc +3 | |
|jmp -450 | |
|acc +11 | |
|acc +19 | |
|jmp -406 | |
|acc +39 | |
|jmp -45 | |
|acc +40 | |
|acc -7 | |
|acc +22 | |
|nop -329 | |
|jmp -160 | |
|jmp +80 | |
|acc +0 | |
|acc -4 | |
|jmp +31 | |
|acc +11 | |
|acc -2 | |
|acc +3 | |
|acc +48 | |
|jmp -366 | |
|acc -16 | |
|jmp -345 | |
|jmp -259 | |
|acc -8 | |
|acc +29 | |
|acc +4 | |
|acc +2 | |
|jmp -208 | |
|acc -6 | |
|acc +48 | |
|acc -3 | |
|jmp +82 | |
|acc +1 | |
|acc +47 | |
|acc +40 | |
|acc +31 | |
|jmp -214 | |
|acc +10 | |
|jmp -328 | |
|acc -18 | |
|acc +39 | |
|jmp +2 | |
|jmp -403 | |
|jmp +48 | |
|jmp +19 | |
|jmp -468 | |
|jmp -397 | |
|acc +40 | |
|acc +39 | |
|acc +22 | |
|jmp +1 | |
|jmp -305 | |
|acc +22 | |
|acc -5 | |
|acc +23 | |
|jmp -399 | |
|acc +21 | |
|jmp +17 | |
|nop -239 | |
|acc +0 | |
|acc +29 | |
|acc +2 | |
|jmp -56 | |
|acc -14 | |
|acc +23 | |
|jmp -375 | |
|jmp -450 | |
|nop +1 | |
|jmp -29 | |
|jmp -208 | |
|nop +50 | |
|jmp -468 | |
|acc +3 | |
|jmp +5 | |
|jmp -347 | |
|acc +21 | |
|acc +35 | |
|jmp -527 | |
|acc -4 | |
|acc -14 | |
|acc -5 | |
|nop +24 | |
|jmp -418 | |
|jmp +66 | |
|acc +8 | |
|acc -16 | |
|jmp -447 | |
|nop -324 | |
|acc +27 | |
|acc +4 | |
|jmp -393 | |
|jmp -276 | |
|jmp +1 | |
|acc +37 | |
|acc +15 | |
|nop -304 | |
|jmp -534 | |
|acc -16 | |
|nop -514 | |
|acc +11 | |
|jmp -331 | |
|nop -69 | |
|acc +14 | |
|acc +44 | |
|jmp -125 | |
|acc +3 | |
|acc +5 | |
|acc +0 | |
|nop -381 | |
|jmp -440 | |
|acc +48 | |
|nop -561 | |
|jmp -543 | |
|acc -10 | |
|acc +44 | |
|acc -16 | |
|acc +45 | |
|jmp -177 | |
|acc +36 | |
|jmp -576 | |
|acc +36 | |
|acc +14 | |
|nop -323 | |
|jmp -163 | |
|jmp -118 | |
|acc -1 | |
|acc -14 | |
|acc +7 | |
|acc +7 | |
|jmp +11 | |
|acc +31 | |
|nop -309 | |
|jmp -109 | |
|acc +41 | |
|acc +11 | |
|acc +4 | |
|jmp -52 | |
|acc +9 | |
|acc +16 | |
|jmp -481 | |
|jmp -161 | |
|acc -8 | |
|acc +13 | |
|acc +16 | |
|jmp -488 | |
|acc +30 | |
|jmp -390 | |
|nop -313 | |
|jmp -333 | |
|jmp -44 | |
|acc +38 | |
|acc +33 | |
|acc +38 | |
|jmp -619 | |
|jmp -186 | |
|acc +49 | |
|acc -5 | |
|acc -16 | |
|jmp -214 | |
|acc +16 | |
|acc +35 | |
|nop -584 | |
|acc -12 | |
|jmp +1 | |
|""".stripMargin |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment