Roderic Day 2 роки тому
джерело
коміт
575fa7e506
1 змінених файлів з 39 додано та 0 видалено
  1. +39
    -0
      y2022/p21.py

+ 39
- 0
y2022/p21.py Переглянути файл

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

Завантаження…
Відмінити
Зберегти