diff --git a/2020/08/input.txt b/2020/08/input.txt new file mode 100644 index 0000000..283b8eb --- /dev/null +++ b/2020/08/input.txt @@ -0,0 +1,683 @@ +acc +42 +acc -12 +nop +112 +acc +47 +jmp +600 +acc +21 +jmp +1 +acc +0 +acc +50 +jmp +16 +acc +10 +jmp +56 +acc -5 +nop +179 +nop +36 +jmp +341 +acc -12 +nop +580 +acc -9 +jmp +112 +acc +12 +acc +6 +acc +40 +acc +1 +jmp +237 +acc +50 +jmp +61 +nop +542 +jmp +644 +nop +598 +nop +280 +acc +34 +acc +10 +jmp +486 +acc +34 +nop +152 +acc +35 +jmp +629 +acc +37 +jmp +447 +acc +50 +nop +522 +acc +43 +jmp +271 +jmp +451 +acc +27 +jmp +1 +acc +24 +nop +532 +jmp +494 +acc +39 +acc -10 +acc +42 +acc -9 +jmp +54 +acc +36 +jmp +236 +acc +34 +acc +47 +nop +613 +acc +27 +jmp +561 +acc +3 +acc -5 +acc +11 +acc +19 +jmp +111 +acc +32 +nop -52 +jmp +108 +acc -16 +acc +40 +jmp +207 +nop -44 +acc +47 +jmp +159 +nop +150 +acc +43 +acc +7 +jmp +200 +nop +141 +acc +2 +jmp +487 +acc +27 +nop +122 +nop +519 +jmp +22 +nop +27 +nop +251 +acc -2 +jmp +171 +acc -11 +jmp +242 +acc +14 +acc -11 +jmp +540 +acc -5 +acc +47 +acc +14 +jmp +252 +acc +34 +acc +28 +acc +1 +jmp +311 +jmp +1 +acc +28 +acc +0 +jmp +321 +acc +23 +acc +8 +acc +26 +acc +0 +jmp +202 +jmp +541 +acc +21 +acc -9 +acc +7 +jmp +81 +acc +5 +acc +31 +acc -16 +jmp +56 +acc -1 +acc +21 +acc +45 +acc -7 +jmp +278 +acc +0 +acc +2 +acc -4 +jmp +514 +acc -1 +acc -16 +acc +32 +jmp +248 +acc +25 +jmp +333 +acc -18 +acc +0 +acc +25 +acc +43 +jmp +416 +acc +18 +nop -127 +acc +37 +acc -4 +jmp +495 +nop +16 +jmp +1 +jmp +320 +acc +22 +jmp +453 +acc -3 +nop +519 +nop +49 +jmp +32 +jmp -89 +acc +11 +acc +31 +jmp +454 +acc +12 +acc +32 +jmp +283 +acc -2 +nop +411 +jmp -65 +acc +0 +nop +25 +acc +5 +acc +0 +jmp +284 +acc -15 +jmp +1 +jmp +166 +acc +27 +acc +50 +jmp +91 +jmp -104 +nop +71 +jmp +358 +acc +15 +acc +1 +jmp -60 +acc +20 +acc +6 +acc +10 +jmp +228 +acc -3 +jmp +316 +acc +5 +acc +11 +jmp +254 +acc -3 +acc +20 +jmp +194 +acc +9 +acc -8 +jmp +6 +acc +30 +jmp +376 +acc -19 +acc -8 +jmp -122 +jmp +3 +nop -41 +jmp -68 +jmp -119 +nop +434 +acc -16 +nop -199 +acc +37 +jmp +68 +acc +3 +acc +18 +acc +38 +acc -8 +jmp +327 +nop +110 +acc +9 +acc +31 +jmp -8 +jmp +130 +acc +20 +acc -1 +nop +16 +jmp +24 +nop +14 +nop -40 +nop -57 +acc +10 +jmp +239 +nop +164 +nop +196 +jmp -208 +acc -12 +jmp +284 +acc +10 +acc +27 +jmp +1 +jmp -195 +acc +1 +acc +10 +acc +25 +acc -17 +jmp +25 +acc +42 +acc +1 +acc -3 +jmp -148 +jmp -28 +acc +34 +nop -222 +acc +3 +acc +15 +jmp +115 +acc +26 +acc +36 +acc +33 +jmp -248 +acc -14 +jmp -89 +acc +19 +acc -14 +acc +34 +jmp +380 +jmp +1 +jmp -5 +jmp +187 +jmp +236 +acc -4 +acc +47 +jmp +2 +jmp +232 +jmp +1 +acc -8 +jmp +397 +acc +7 +acc +2 +jmp +136 +jmp +325 +acc +11 +acc -17 +acc -4 +jmp -43 +acc +20 +acc -9 +jmp +60 +acc +36 +acc +49 +nop +333 +acc +38 +jmp -169 +acc +2 +acc +8 +jmp +82 +acc +6 +jmp -159 +acc +25 +acc +23 +acc +18 +acc +41 +jmp -138 +jmp -145 +acc +49 +acc +37 +jmp +123 +acc +2 +nop +179 +acc -19 +jmp -152 +jmp -294 +acc +50 +acc +50 +jmp -46 +acc +17 +jmp -158 +acc -11 +acc +5 +acc -6 +jmp +278 +acc +3 +acc +26 +acc +27 +acc +24 +jmp -69 +acc +22 +jmp +204 +acc +15 +acc +49 +acc +1 +acc +22 +jmp +149 +acc +31 +jmp +131 +jmp -309 +acc +40 +acc +39 +acc +44 +jmp -216 +acc +15 +acc +17 +jmp +54 +nop +157 +acc +24 +acc +18 +jmp -111 +acc -6 +jmp +22 +acc +17 +acc -3 +jmp -228 +acc -2 +acc +41 +jmp +235 +nop +234 +jmp -82 +nop -83 +acc +44 +acc +39 +nop +216 +jmp -180 +jmp -163 +acc +13 +acc +0 +jmp +1 +jmp +301 +acc +14 +nop -187 +jmp -181 +acc +48 +nop +169 +acc +27 +jmp -334 +nop -226 +acc +3 +jmp -61 +jmp +1 +acc -15 +jmp -175 +acc +9 +acc +19 +jmp +223 +acc +20 +acc +39 +acc +50 +acc +13 +jmp -119 +jmp +240 +acc +50 +acc +40 +acc -14 +jmp +236 +acc +0 +acc +0 +jmp +34 +acc +20 +acc -3 +nop -136 +acc +4 +jmp -370 +acc +38 +acc +25 +acc +9 +jmp -240 +jmp +1 +acc -10 +acc +21 +acc +46 +jmp +118 +acc -8 +acc +12 +nop +64 +acc +0 +jmp +253 +acc +32 +acc -6 +acc +44 +jmp +115 +acc +36 +acc +23 +acc +21 +nop +88 +jmp -275 +acc +8 +jmp -127 +acc +5 +acc +42 +jmp +82 +acc +41 +acc +31 +acc +45 +acc +20 +jmp +131 +acc +21 +acc +7 +jmp +97 +acc +12 +acc +0 +nop +61 +acc +36 +jmp -106 +acc +20 +acc -1 +acc -14 +jmp -210 +acc -12 +acc -19 +acc -19 +jmp -25 +acc -11 +nop -247 +acc +0 +acc +7 +jmp -290 +acc +36 +acc +43 +acc +8 +nop -154 +jmp -102 +acc +8 +acc +31 +acc +44 +acc -5 +jmp -184 +jmp -252 +acc +50 +acc +18 +acc +5 +jmp -141 +jmp -159 +acc -4 +acc +8 +acc +4 +acc -5 +jmp +56 +acc +19 +acc +46 +jmp +53 +acc +45 +jmp -316 +acc -5 +acc -1 +nop +98 +jmp +195 +jmp +1 +jmp +58 +acc +15 +nop -471 +acc +14 +jmp +48 +nop -269 +nop +8 +nop -223 +acc +24 +jmp -288 +jmp +85 +nop -1 +jmp +1 +jmp +45 +acc +48 +nop -490 +acc +0 +jmp +37 +jmp +132 +acc +5 +jmp -256 +acc +12 +acc +22 +jmp -479 +acc +15 +nop -56 +acc -18 +acc -6 +jmp -157 +nop +16 +acc +5 +acc +26 +acc +42 +jmp -172 +acc -13 +acc -2 +jmp -237 +acc +9 +acc -10 +acc -16 +jmp +32 +acc +11 +acc +3 +jmp -208 +jmp -449 +jmp -383 +jmp +96 +acc -9 +acc -14 +jmp -30 +nop -36 +jmp +21 +jmp +117 +jmp -169 +jmp -387 +acc -5 +acc -9 +jmp -344 +acc +13 +acc +4 +acc +45 +jmp -219 +acc +9 +acc +44 +acc +31 +acc +16 +jmp -71 +jmp -77 +acc -1 +acc +40 +acc +31 +jmp -385 +acc +1 +jmp -255 +nop -20 +acc +0 +acc +29 +jmp -180 +acc +13 +acc +5 +nop -292 +jmp -204 +acc +30 +jmp -265 +acc +19 +acc +31 +jmp -457 +acc +16 +acc +27 +jmp +67 +jmp +88 +acc +20 +acc +44 +acc +27 +jmp -40 +acc +26 +acc +48 +acc +28 +acc -12 +jmp -120 +acc -9 +acc +42 +jmp -543 +acc +4 +nop +83 +acc +41 +jmp -28 +acc +40 +acc -17 +acc +14 +acc -6 +jmp -70 +nop -294 +acc -10 +acc +9 +acc +7 +jmp -322 +jmp +1 +jmp -46 +acc +0 +acc +38 +acc +6 +jmp -381 +acc +49 +acc -16 +acc +35 +acc +45 +jmp -184 +acc -6 +acc -13 +acc +9 +jmp -180 +acc +18 +acc +49 +acc -4 +nop -197 +jmp -395 +nop -266 +jmp -530 +acc +16 +acc +9 +jmp -117 +acc -4 +acc -7 +acc +44 +acc +35 +jmp -122 +acc +31 +acc -5 +jmp -503 +jmp -555 +acc +19 +acc +25 +acc -10 +acc +50 +jmp -493 +jmp -591 +acc +40 +jmp -491 +nop +28 +nop -48 +acc +11 +nop -25 +jmp -591 +jmp +1 +acc -15 +acc +21 +acc +46 +jmp -199 +jmp +1 +acc +42 +acc +10 +acc -11 +jmp -213 +acc -8 +acc +2 +acc +36 +jmp -470 +acc +37 +jmp -195 +jmp -38 +acc +17 +jmp -26 +nop -376 +acc +27 +acc +11 +jmp -185 +acc +44 +acc +12 +acc +9 +acc +14 +jmp -626 +jmp -89 +acc +45 +acc +23 +acc +13 +acc +19 +jmp +1 diff --git a/2020/08/python.py b/2020/08/python.py new file mode 100644 index 0000000..eec5d39 --- /dev/null +++ b/2020/08/python.py @@ -0,0 +1,92 @@ +import re +# from typing import Tuple + +from aocd import submit + +with open("input.txt") as f: + # List of tuples + # [('nop', '+0'), ...] + bootcode = [ tuple(line.strip().split()) for line in f.readlines() ] + + +ran_indexes = [] # List of bootcode indexes that have been run + +def runcode(i: int = 0, acc: int = 0, reset: bool = False, flip_index: int = -1) -> tuple[int, bool]: + """Run the boot code, return final acc value, and whether it properly terminates + + Parameters: + i (int) index + acc (int) acc value + reset (bool) whether to reset the list of indexes of codes already ran + flip_index (int) the index of bootcode to which should flip nop/jmp + (set to -1 or under for none). The actual left operand of the + bootcode at index flip_index does not need to actually be nop/jmp + + Returns: Tuple of the final acc value, and whether it loops infinitely. + """ + global ran_indexes + # Success means, pointer have reached end of boot code, hence it terminates successfully + if i == len(bootcode): + return acc, False + if reset: ran_indexes = [] + + # It's an infinite loop as the current line of boot code has already been run before + if i in ran_indexes: + return acc, True + + # Begin runnign the current bootcode line + ran_indexes.append(i) + op, arg = bootcode[i] + arg = int(arg) + + # Flip nop/jmp + # if (op in (nj:=('nop', 'jmp'))) and i == flip_index: + # op = nj[(nj.index(op)+1)%2] + op = nj[(nj.index(op)+1)%2] if op in (nj := ('nop', 'jmp')) and i == flip_index else op + + # Finally, parse the code. + # Possible op codes: + # - acc: add arg to the acc + # - jmp: jump arg lines in the boot code to run another instruction + # - nop: no operation + if op == 'acc': acc += arg + elif op == 'jmp': return runcode(i+arg, acc, flip_index=flip_index) + # Proceed to next line (for acc and nop) + return runcode(i+1, acc, flip_index=flip_index) + + +# False as ran_indexes was newly initiated - avoid extra assignment of new list object +print(a := runcode()[0]) +submit(a, "a", 8, 2020) + +inf = True; i = 0 +while inf: + if i == len(bootcode): + print("FAIL"); break + a, inf = runcode(reset=True, flip_index=i) + i += 1 + +print(a) +submit(a, "b", 8, 2020) + + +# Old impl + +# part 2 +# one of the nop instructions changed to jmp, or vice verse, so that the program terminates without infinite looping +# oldcode = bootcode.copy() +# i = -1 +# while not term: +# bootcode[i] = oldcode[i] +# i += 1 +# if i == len(bootcode): +# print("FAIL") +# break +# op, arg = bootcode[i] +# if op != 'acc': +# bootcode[i] = ('jmp' if op == 'nop' else 'nop', arg) +# else: +# old = tuple() +# continue +# ran_indexes = [] +# a, term = runcode2(0, 0)