2024-12-24 09:02:22 -05:00
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import random
|
|
|
|
sys.path.insert(1, os.path.abspath('../../'))
|
|
|
|
from python_tools.aoc_utils import *
|
|
|
|
|
|
|
|
def resolve(i, n, g):
|
|
|
|
if i in n:
|
|
|
|
return n[i]
|
|
|
|
else:
|
|
|
|
a = resolve(g[i][0], n, g)
|
|
|
|
b = resolve(g[i][2], n, g)
|
|
|
|
if g[i][1] == "AND":
|
|
|
|
return a & b
|
|
|
|
elif g[i][1] == "OR":
|
|
|
|
return a | b
|
|
|
|
elif g[i][1] == "XOR":
|
|
|
|
return a ^ b
|
|
|
|
|
|
|
|
|
|
|
|
def part_one(n, g):
|
|
|
|
p1 = 0
|
|
|
|
for i in g:
|
|
|
|
if "z" in i:
|
|
|
|
p1 = p1 | (resolve(i, n, g) << int(i.replace("z", "")))
|
|
|
|
return p1
|
|
|
|
|
|
|
|
def add2sus(sus, g, s):
|
|
|
|
if s in g:
|
2024-12-24 14:09:14 -05:00
|
|
|
sus.add(s)
|
2024-12-24 09:02:22 -05:00
|
|
|
add2sus(sus, g, g[s][0])
|
|
|
|
add2sus(sus, g, g[s][2])
|
|
|
|
|
|
|
|
def sus(z1, z2, g):
|
2024-12-24 14:09:14 -05:00
|
|
|
sus_g = set()
|
2024-12-24 09:02:22 -05:00
|
|
|
binz = list(bin(z1 ^ z2)[2:])
|
|
|
|
binz.reverse()
|
|
|
|
for c, i in enumerate(binz):
|
|
|
|
if i == '1':
|
|
|
|
add2sus(sus_g, g, f"z{c:02}")
|
|
|
|
print(len(sus_g))
|
|
|
|
print(len(g))
|
|
|
|
|
|
|
|
def gen_n(x,y):
|
2024-12-24 14:09:14 -05:00
|
|
|
n={}
|
|
|
|
for c in range(45):
|
|
|
|
n[f"x{c:02}"] = int(0)
|
|
|
|
n[f"y{c:02}"] = int(0)
|
|
|
|
|
2024-12-24 09:02:22 -05:00
|
|
|
xbin = list(bin(x)[2:])
|
|
|
|
ybin = list(bin(y)[2:])
|
|
|
|
xbin.reverse()
|
|
|
|
ybin.reverse()
|
|
|
|
for c, x in enumerate(xbin):
|
|
|
|
n[f"x{c:02}"] = int(x)
|
|
|
|
for c, y in enumerate(ybin):
|
|
|
|
n[f"y{c:02}"] = int(y)
|
|
|
|
return n
|
|
|
|
|
2024-12-24 14:09:14 -05:00
|
|
|
def test(x, y, z, g):
|
2024-12-24 09:02:22 -05:00
|
|
|
n = gen_n(x, y)
|
2024-12-24 14:09:14 -05:00
|
|
|
z = part_one(n, g.copy())
|
|
|
|
return z == x+y
|
|
|
|
|
|
|
|
def check_l_rec(s, g, visited):
|
|
|
|
if s in g:
|
|
|
|
for ss in g[s][0]:
|
|
|
|
if ss in visited:
|
|
|
|
return True
|
|
|
|
if check_l_rec(ss, g, set(list(visited)+[ss])):
|
|
|
|
return True
|
|
|
|
for ss in g[s][2]:
|
|
|
|
if ss in visited:
|
|
|
|
return True
|
|
|
|
if check_l_rec(ss, g, set(list(visited)+[ss])):
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def check4loop(g):
|
|
|
|
for i in g:
|
|
|
|
if 'z' in i:
|
|
|
|
if check_l_rec(i, g, set(i)):
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
|
|
|
|
def part_two(n, g):
|
|
|
|
# import graphviz
|
|
|
|
# dot = graphviz.Digraph(comment='The Round Table')
|
|
|
|
# for i in g:
|
|
|
|
# dot.node(i)
|
|
|
|
# for i in g:
|
|
|
|
# color = "blue"
|
|
|
|
# if g[i][1] == "AND":
|
|
|
|
# color = "red"
|
|
|
|
# elif g[i][1] == "OR":
|
|
|
|
# color = "green"
|
|
|
|
# dot.edge(g[i][0], i, g[i][1], color=color)
|
|
|
|
# dot.edge(g[i][2], i, g[i][1], color=color )
|
|
|
|
# dot.render('round-table.gv', view=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-24 09:02:22 -05:00
|
|
|
|
|
|
|
def main():
|
|
|
|
contents = file2list("input.txt")
|
|
|
|
n = {}
|
|
|
|
g = {}
|
|
|
|
for i in contents:
|
|
|
|
if ": " in i:
|
|
|
|
x = i.split(": ")
|
|
|
|
n[x[0]] = int(x[1])
|
|
|
|
elif "->" in i:
|
|
|
|
x = i.split(" -> ")
|
|
|
|
g[x[1]] = x[0].split(" ")
|
|
|
|
|
|
|
|
print("p1: ", part_one(n.copy(), g.copy()))
|
|
|
|
part_two(n.copy(), g.copy())
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|
|
|
|
|