75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
|
from helpers import *
|
||
|
from sympy import Symbol, Eq, solve
|
||
|
|
||
|
lines = read_day(day).split('\n')
|
||
|
|
||
|
sample_lines = '''
|
||
|
root: pppw + sjmn
|
||
|
dbpl: 5
|
||
|
cczh: sllz + lgvd
|
||
|
zczc: 2
|
||
|
ptdq: humn - dvpt
|
||
|
dvpt: 3
|
||
|
lfqf: 4
|
||
|
humn: 5
|
||
|
ljgn: 2
|
||
|
sjmn: drzm * dbpl
|
||
|
sllz: 4
|
||
|
pppw: cczh / lfqf
|
||
|
lgvd: ljgn * ptdq
|
||
|
drzm: hmdt - zczc
|
||
|
hmdt: 32
|
||
|
'''.strip().split('\n')
|
||
|
|
||
|
monkey_re = re.compile(r'(\w{4})')
|
||
|
def eval_root(lines: list[str]):
|
||
|
monkeys = {}
|
||
|
for line in lines:
|
||
|
monkey, _, operation = line.partition(': ')
|
||
|
operation = monkey_re.sub(r'e("\1")', operation)
|
||
|
# print(monkey, operation)
|
||
|
monkeys[monkey] = operation
|
||
|
|
||
|
@cache
|
||
|
def e(monkey):
|
||
|
return eval(monkeys[monkey], {'e': e})
|
||
|
|
||
|
return int(e('root'))
|
||
|
|
||
|
def inline_monkeys(lines: list[str]):
|
||
|
monkeys = {}
|
||
|
for line in lines:
|
||
|
monkey, _, operation = line.partition(': ')
|
||
|
monkeys[monkey] = operation
|
||
|
|
||
|
monkeys['root'] = monkeys['root'].replace('+', '==')
|
||
|
monkeys['humn'] = 'X'
|
||
|
|
||
|
# delisp_pattern = re.compile(r'\((\d+)\)')
|
||
|
# eval_pattern = re.compile(r'\((\d+[\+\-\*\/]+\d+)\)')
|
||
|
# def ev(s):
|
||
|
# last = ''
|
||
|
# out = s.replace(' ', '').replace('/', '//')
|
||
|
# while last != out:
|
||
|
# # print('looped')
|
||
|
# last = out
|
||
|
# out = eval_pattern.sub(lambda m: str(eval(m.group(1))), last)
|
||
|
# out = delisp_pattern.sub(r'\1', out)
|
||
|
# return out.replace('//', '/')
|
||
|
|
||
|
@cache
|
||
|
def inline(monkey) -> str:
|
||
|
return monkey_re.sub(lambda m: inline(m.group(1)), f'({monkeys[monkey]})')
|
||
|
# return ev(inline('root'))
|
||
|
# lhs, _, rhs = ev(inline('root')).partition('==')
|
||
|
lhs, _, rhs = inline('root')[1:-1].partition('==') # above leaves residual () around entire expression
|
||
|
X = Symbol('X')
|
||
|
# return solve(Eq(lhs, rhs))
|
||
|
return int(eval(f'solve(Eq({lhs}, {rhs}))')[0])
|
||
|
|
||
|
|
||
|
print(f'Part 1 (sample): {eval_root(sample_lines)}') #152
|
||
|
print(f'Part 1: {eval_root(lines)}') # 66174565793494
|
||
|
print(f'Part 2 (sample): {inline_monkeys(sample_lines)}')
|
||
|
print(f'Part 2: {inline_monkeys(lines)}')
|