Finish 2020 Day 8 (yesterday)

This commit is contained in:
hedy 2022-12-07 09:50:00 +08:00
parent c0cb2b9307
commit 60d4007307
Signed by: hedy
GPG Key ID: B51B5A8D1B176372
2 changed files with 775 additions and 0 deletions

683
2020/08/input.txt Normal file
View File

@ -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

92
2020/08/python.py Normal file
View File

@ -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)