You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

45 lines
1.7 KiB

#!/usr/bin/env python3
import sys
def replace_ins(gate, gates, inp):
g0, f, g1 = gate.split(' ')
if g0 in inp and g1 in inp: return inp[g0] + ' ' + f + ' ' + inp[g1]
elif g0[0] not in ['x', 'y'] and g1[0] in ['x', 'y']:
return '(' + replace_ins(gates[g0], gates, inp) + ')' + ' ' + f + ' ' + inp[g1]
elif g0[0] in ['x', 'y'] and g1[0] not in ['x', 'y']:
return inp[g0] + ' ' + f + ' ' + '(' + replace_ins(gates[g1], gates, inp) + ')'
else:
return '(' + replace_ins(gates[g0], gates, inp) + ')' + ' ' + f + ' ' + '(' + replace_ins(gates[g1], gates, inp) + ')'
if __name__ == '__main__':
values, gates = open(sys.argv[1]).read().split('\n\n')
ins = {v.split(': ')[0]: v.split(': ')[1] for v in values.split('\n')}
gates = {g.split(' -> ')[1]: g.split(' -> ')[0].lower().replace('xor', '^') for g in gates.split('\n')[:-1]}
out = {}
for g in gates.keys():
exec('out[g] = ' + replace_ins(gates[g], gates, ins))
# for g in gates.keys():
# g0, f, g1 = gates[g].split(' ')
# print(g, g0, f, g1)
# print(out[g])
# challenge 1
res1 = 0
for (o,v) in sorted(out.items(),key=lambda x: x[0],reverse=True):
if o.startswith('z'): res1 = (res1 << 1) | v
print(f"challenge 1:\n{res1}\n")
# challenge 2, empiric solution
x, y = 0, 0
for bit in [int(v) for (o,v) in sorted(ins.items(),key=lambda x: x[0],reverse=True) if o.startswith('x')]:
x = (x << 1) | bit
for bit in [int(v) for (o,v) in sorted(ins.items(),key=lambda x: x[0],reverse=True) if o.startswith('y')]:
y = (y << 1) | bit
res2 = ','.join(sorted(['dkr', 'z05', 'z15', 'htp', 'ggk', 'rhv', 'hhh', 'z20']))
print(f"challenge 2:\n{res2}")