Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pathlib
- import operator
- ops = {'+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.floordiv}
- with pathlib.Path("day21.txt").open('r') as f:
- known, known2, unknown = {}, {}, []
- for k, v in (l.strip().split(": ", 1) for l in f.readlines()):
- if len(bits := v.split(' ')) == 1:
- known2[k] = known[k] = int(v)
- else:
- unknown.append((k, bits[0], ops[bits[1]], bits[2]))
- while unknown:
- for _ in range(len(unknown)):
- k, m1, op, m2 = r = unknown.pop(0)
- if m1 not in known or m2 not in known:
- unknown.append(r)
- continue
- known[k] = int(op(known[m1], known[m2]))
- if k == 'root':
- known2[k] = (known2[m1], known2[m2])
- elif 'humn' not in (m1, m2) and isinstance(known2[m1], int) and isinstance(known2[m2], int):
- known2[k] = known[k]
- else:
- known2[k] = (op, 'x' if m1 == 'humn' else known2[m1], 'x' if m2 == 'humn' else known2[m2])
- print(known['root'])
- l, r = known2['root']
- if isinstance(r, int): # one of l and r is literal - make sure it is l
- t = r; r = l; l = t # swap r and l
- while r: # reverse the equation to solve for x
- if r == 'x': break # we're done!
- fn, a, b = r
- r = a if isinstance(b, int) else b # keep expanding into which ever of a and b is a tuple
- # rearrange the current level of the equation to put the tuple on the right
- if fn == operator.floordiv: # l = a / b
- l = l*b if isinstance(b, int) else a / l
- elif fn == operator.mul: # l = a * b
- l = int(l / (a if isinstance(a, int) else b))
- elif fn == operator.sub: # l = a - b
- l = a-l if isinstance(a, int) else l+b
- else: # l = a + b
- l = l - (a if isinstance(a, int) else b)
- print(l)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement