Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

75 lines
1.6KB

  1. import re
  2. def parse(string):
  3. return [int(n) for n in re.findall(r'-?\d+', string)]
  4. def get_parameters(ns, pos, modes, N, writes):
  5. for c in writes:
  6. # paradox: return immediate mode to use positionally outside
  7. modes[ord(c) - ord('a')] = '1'
  8. for mode, x in zip(modes, ns[pos:][:N]):
  9. yield {
  10. '0': lambda: ns[x],
  11. '1': lambda: x,
  12. }[mode]()
  13. yield pos + N
  14. def compute(ns, inp):
  15. if isinstance(ns, str):
  16. ns = parse(ns)
  17. pos = 0
  18. consume = lambda n, writes='': get_parameters(ns, pos, modes, n, writes)
  19. while True:
  20. op = ns[pos] % 100
  21. # instructions stupidly say ABC referring to parameters 3, 2, 1
  22. # we do a, b, c
  23. modes = list(str(ns[pos] // 100).zfill(3)[::-1])
  24. pos += 1
  25. if op == 1:
  26. a, b, c, pos = consume(3, 'c')
  27. ns[c] = a + b
  28. elif op == 2:
  29. a, b, c, pos = consume(3, 'c')
  30. ns[c] = a * b
  31. elif op == 3:
  32. a, pos = consume(1, 'a')
  33. ns[a] = inp
  34. elif op == 4:
  35. a, pos = consume(1)
  36. yield a
  37. elif op == 5:
  38. a, b, pos = consume(2)
  39. if a != 0:
  40. pos = b
  41. elif op == 6:
  42. a, b, pos = consume(2)
  43. if a == 0:
  44. pos = b
  45. elif op == 7:
  46. a, b, c, pos = consume(3, 'c')
  47. ns[c] = int(a < b)
  48. elif op == 8:
  49. a, b, c, pos = consume(3, 'c')
  50. ns[c] = int(a == b)
  51. elif op == 99:
  52. return
  53. else:
  54. raise RuntimeError(op)