| from functools import lru_cache | |||||
| @lru_cache(maxsize=None) | |||||
| def fn(seed=None): | |||||
| instructions = map(str.split, text.replace(':', '').splitlines()) | |||||
| while instructions: | |||||
| act, *instructions = instructions | |||||
| try: | |||||
| match act: | |||||
| case ['root', a, _, b] if seed is not None: | |||||
| return eval(a) - eval(b) | |||||
| case ['humn', _] if seed is not None: | |||||
| locals()['humn'] = seed | |||||
| case [name, a, x, b]: | |||||
| locals()[name] = eval(a + x + b) | |||||
| case [name, a]: | |||||
| locals()[name] = eval(a) | |||||
| case default: | |||||
| raise RuntimeError(default) | |||||
| except NameError: | |||||
| instructions.append(act) | |||||
| return int(locals()['root']) | |||||
| def bisect(fn, x1, x2): | |||||
| for _ in range(100): | |||||
| xn = x1 + (x2 - x1) // 2 | |||||
| if fn(xn) == 0: | |||||
| return xn | |||||
| elif abs(fn(x1)) > abs(fn(x2)): | |||||
| x1 = xn | |||||
| else: | |||||
| x2 = xn | |||||
| text = open(0).read() | |||||
| print(fn()) | |||||
| print(bisect(fn, 0, 10_000_000_000_000)) |