|
|
@@ -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)) |