| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- #!/usr/bin/env python3
- import sys
- from operator import mul, floordiv, add, sub
- class Expr:
- def __init__(self, left, op, right):
- self.left = left
- self.op = op
- self.right = right
- def __str__(self):
- return '(%s %s %s)' % (self.left, self.op, self.right)
- def simplify(expr, solve=None):
- if isinstance(expr, (int, str)):
- return expr
- left = simplify(expr.left)
- right = simplify(expr.right)
- if isinstance(left, int) and isinstance(right, int):
- fn = {'*': mul, '/': floordiv, '-': sub, '+': add}[expr.op]
- return fn(left, right)
- if isinstance(left, int) and expr.op in '*+':
- return simplify(Expr(right, expr.op, left))
- if expr.op == '=' and isinstance(left, Expr):
- if isinstance(left.right, int):
- inv = {'*': '/', '/': '*', '-': '+', '+': '-'}[left.op]
- return simplify(Expr(left.left, '=', Expr(right, inv, left.right)))
- if isinstance(left.left, int) and left.op == '-':
- return simplify(Expr(left.right, '=', Expr(left.left, '-', right)))
- if expr.op == '=' and left == solve:
- return right
- return Expr(left, expr.op, right)
- def parse(tasks, monkey):
- task = tasks[monkey]
- if ' ' in task:
- left, op, right = task.split()
- return Expr(parse(tasks, left), op, parse(tasks, right))
- return int(task) if task.isdigit() else task
- tasks = dict(line.rstrip().split(': ') for line in sys.stdin)
- print(simplify(parse(tasks, 'root')))
- tasks['humn'] = 'humn'
- left, _, right = tasks['root'].split()
- tasks['root'] = left + ' = ' + right
- print(simplify(parse(tasks, 'root')))
|