Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

40 lines
1.1KB

  1. from functools import lru_cache
  2. @lru_cache(maxsize=None)
  3. def fn(seed=None):
  4. instructions = map(str.split, text.replace(':', '').splitlines())
  5. while instructions:
  6. act, *instructions = instructions
  7. try:
  8. match act:
  9. case ['root', a, _, b] if seed is not None:
  10. return eval(a) - eval(b)
  11. case ['humn', _] if seed is not None:
  12. locals()['humn'] = seed
  13. case [name, a, x, b]:
  14. locals()[name] = eval(a + x + b)
  15. case [name, a]:
  16. locals()[name] = eval(a)
  17. case default:
  18. raise RuntimeError(default)
  19. except NameError:
  20. instructions.append(act)
  21. return int(locals()['root'])
  22. def bisect(fn, x1, x2):
  23. for _ in range(100):
  24. xn = x1 + (x2 - x1) // 2
  25. if fn(xn) == 0:
  26. return xn
  27. elif abs(fn(x1)) > abs(fn(x2)):
  28. x1 = xn
  29. else:
  30. x2 = xn
  31. text = open(0).read()
  32. print(fn())
  33. print(bisect(fn, 0, 10_000_000_000_000))