120 lines
3.5 KiB
Python
120 lines
3.5 KiB
Python
import re
|
|
import sys
|
|
import copy
|
|
# import numpy as np
|
|
import os
|
|
from warnings import showwarning
|
|
sys.path.insert(1, os.path.abspath('../../'))
|
|
from python_tools.aoc_utils import *
|
|
|
|
def part_one(registers, program):
|
|
pc = 0
|
|
out = []
|
|
looping = True
|
|
last_state = 0
|
|
current_state = [registers, program, pc]
|
|
while looping:
|
|
if pc > len(program)-1 or current_state == last_state:
|
|
looping = False
|
|
break
|
|
else:
|
|
operands = [0,1,2,3,registers["A"],registers["B"],registers["C"], 7]
|
|
co = operands[program[pc+1]]
|
|
lo = program[pc+1]
|
|
|
|
match program[pc]:
|
|
case 0:
|
|
registers["A"] = registers["A"] >> co
|
|
pc += 2
|
|
case 1:
|
|
registers["B"] = registers["B"] ^ lo
|
|
pc += 2
|
|
case 2:
|
|
registers["B"] = co % 8
|
|
pc += 2
|
|
case 3:
|
|
if registers["A"] == 0:
|
|
pc += 2
|
|
else:
|
|
pc = lo
|
|
case 4:
|
|
registers["B"] = registers["B"] ^ registers["C"]
|
|
pc += 2
|
|
case 5:
|
|
out.append(int(co % 8))
|
|
pc += 2
|
|
case 6:
|
|
registers["B"] = registers["A"] >> co
|
|
pc += 2
|
|
case 7:
|
|
registers["C"] = registers["A"] >> co
|
|
pc += 2
|
|
print("P1: ", str(out).strip('[]').replace(" ", ""))
|
|
|
|
def part_two(r, p):
|
|
pc = 0
|
|
out = []
|
|
looping = True
|
|
last_state = 0
|
|
current_state = [registers, program, pc]
|
|
while looping:
|
|
if pc > len(program)-1 or current_state == last_state:
|
|
looping = False
|
|
break
|
|
else:
|
|
operands = [0,1,2,3,registers["A"],registers["B"],registers["C"], 7]
|
|
co = operands[program[pc+1]]
|
|
lo = program[pc+1]
|
|
|
|
match program[pc]:
|
|
case 0:
|
|
registers["A"] = registers["A"] >> co
|
|
pc += 2
|
|
case 1:
|
|
registers["B"] = registers["B"] ^ lo
|
|
pc += 2
|
|
case 2:
|
|
registers["B"] = co % 8
|
|
pc += 2
|
|
case 3:
|
|
if registers["A"] == 0:
|
|
pc += 2
|
|
else:
|
|
pc = lo
|
|
case 4:
|
|
registers["B"] = registers["B"] ^ registers["C"]
|
|
pc += 2
|
|
case 5:
|
|
out.append(int(co % 8))
|
|
pc += 2
|
|
case 6:
|
|
registers["B"] = registers["A"] >> co
|
|
pc += 2
|
|
case 7:
|
|
registers["C"] = registers["A"] >> co
|
|
pc += 2
|
|
print("P2: ", count)
|
|
|
|
def main():
|
|
program = []
|
|
registers = {}
|
|
pos = [0,0]
|
|
contents = file2list("input.txt")
|
|
for row, i in enumerate(contents):
|
|
if "Register" in i:
|
|
a = i.split(":")
|
|
registers[a[0].replace("Register ", "")] = int(a[1].strip())
|
|
|
|
elif "Program" in i:
|
|
i = i.replace("Program: ", "")
|
|
program = list(map(int, i.split(",")))
|
|
print(registers, program)
|
|
|
|
part_one(registers.copy(), program)
|
|
part_two(registers.copy(), program)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|