Extremely borken but commiting before leaving for work
This commit is contained in:
parent
096ceb0738
commit
84ef4499eb
119
2024/day17/main.py
Normal file
119
2024/day17/main.py
Normal file
@ -0,0 +1,119 @@
|
||||
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()
|
||||
|
Loading…
Reference in New Issue
Block a user