| @@ -0,0 +1,39 @@ | |||
| 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)) | |||