parent
8a388595bc
commit
c482fac425
@ -0,0 +1,129 @@ |
||||
#!/usr/bin/env python |
||||
|
||||
from aoc import get_input # AoC |
||||
import re # regex |
||||
from copy import copy |
||||
|
||||
CodeLines = get_input(8).splitlines() |
||||
print(CodeLines) |
||||
|
||||
def parseCode(code): |
||||
if( code and code != "" ): |
||||
regex = r"^([a-z]{3}) ([\+\-]{1})([0-9]+)$" |
||||
op, sign, num = re.match(regex, code).groups() |
||||
|
||||
return op, sign, int(num) |
||||
else: |
||||
print("INVALID CODE:", code) |
||||
return |
||||
|
||||
|
||||
accu = 0 |
||||
line = 0 |
||||
|
||||
def runCode(op, sign, num, newline=line, newaccu=accu): |
||||
if( op == "nop" ): |
||||
newline += 1 |
||||
elif( op == "acc" ): |
||||
if( sign == "+" ): |
||||
newaccu += num |
||||
elif( sign == "-" ): |
||||
newaccu -= num |
||||
|
||||
newline += 1 |
||||
elif( op == "jmp" ): |
||||
if( sign == "+" ): |
||||
newline += num |
||||
elif( sign == "-" ): |
||||
newline -= num |
||||
|
||||
return newline, newaccu |
||||
|
||||
|
||||
def swapCode(line, codes): |
||||
op, sign, num = parseCode(codes[line]) |
||||
newcode = "" |
||||
|
||||
if( op == "nop" ): |
||||
newcode = f"jmp {sign}{num}" |
||||
elif( op == "jmp" ): |
||||
newcode = f"nop {sign}{num}" |
||||
else: |
||||
return codes[line] |
||||
|
||||
return newcode |
||||
|
||||
|
||||
def runProgram(codes=CodeLines, i=0, linefix=None, linecode=None, oldline=None): |
||||
print(f"\nRunning program iter:{i}") |
||||
print(f"Codes: {codes}") |
||||
seenLines = [] |
||||
codeLen = len(codes) |
||||
|
||||
line = 0 |
||||
accu = 0 |
||||
|
||||
loop = False |
||||
|
||||
while True: |
||||
try: |
||||
if( not loop ): |
||||
if( line < codeLen ): |
||||
code = codes[line] |
||||
op, sign, num = parseCode(code) |
||||
|
||||
newline, newaccu = runCode(op, sign, num, line, accu) |
||||
|
||||
print(f"op:{op} num:{sign}{num} line:{line}/{codeLen} newline:{newline}/{codeLen} accu:{accu} newaccu:{newaccu}") |
||||
|
||||
if(newline in seenLines): |
||||
print(f"REPEAT AT: line:{line} newline:{newline} newaccu:{newaccu} seenLines:{seenLines}") |
||||
|
||||
if( op == "jmp" ): |
||||
loop = True |
||||
print("LOOP") |
||||
|
||||
seenLines.append(newline) |
||||
accu = newaccu |
||||
line = newline |
||||
|
||||
else: |
||||
print("END OF PROGRAM") |
||||
print(accu, line) |
||||
return accu, line, codeLen |
||||
else: |
||||
print("BAD LOOP") |
||||
break |
||||
except: |
||||
print(f"ERROR line:{line} maxline:{codeLen}") |
||||
print(accu) |
||||
return accu, line, codeLen |
||||
|
||||
count = 0 |
||||
|
||||
jmpThings = dict() |
||||
|
||||
for l in range(len(CodeLines)): |
||||
code = CodeLines[l] |
||||
newcodes = CodeLines |
||||
op, sign, num = parseCode(code) |
||||
|
||||
if( op == "nop" or op == "jmp" ): |
||||
jmpThings[l] = (op, sign, num) |
||||
|
||||
print(jmpThings) # Need to change one of these |
||||
|
||||
for codeline, ins in jmpThings.items(): |
||||
print("\n\n####") |
||||
newcodes = copy(CodeLines) |
||||
newcodes[codeline] = swapCode(codeline, CodeLines) |
||||
print(f"newcodes:{newcodes} | {newcodes[codeline]}") |
||||
print(f"oldcodes:{CodeLines} | {CodeLines[codeline]}") |
||||
|
||||
out = runProgram(newcodes) |
||||
print(f"OUT:{out}") |
||||
if( out ): |
||||
print("############ OUT:", out) |
||||
break |
||||
else: |
||||
continue |
Loading…
Reference in new issue