選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

61 行
1.3KB

  1. import functools as ft
  2. import operator as op
  3. opes = {
  4. 0: sum,
  5. 1: lambda ns: ft.reduce(op.mul, ns),
  6. 2: min,
  7. 3: max,
  8. 4: None,
  9. 5: lambda ns: op.gt(ns[0], ns[1]),
  10. 6: lambda ns: op.lt(ns[0], ns[1]),
  11. 7: lambda ns: op.eq(ns[0], ns[1]),
  12. }
  13. def read(stream, n):
  14. return int(''.join(next(stream) for _ in range(n)), 2)
  15. def literal(stream):
  16. coll = 0
  17. while next(stream) == '1':
  18. coll |= read(stream, 4)
  19. coll <<= 4
  20. coll |= read(stream, 4)
  21. return coll
  22. def consume(stream):
  23. ver = read(stream, 3)
  24. vers.append(ver)
  25. tid = read(stream, 3)
  26. ope = opes[tid]
  27. if ope is None:
  28. return literal(stream)
  29. else:
  30. I = next(stream)
  31. if I == '1':
  32. length = read(stream, 11)
  33. ns = [consume(stream) for _ in range(length)]
  34. return ope(ns)
  35. elif I == '0':
  36. length = read(stream, 15)
  37. sub = (next(stream) for _ in range(length))
  38. ns = []
  39. while True:
  40. try:
  41. ns.append(consume(sub))
  42. except RuntimeError:
  43. break
  44. return ope(ns)
  45. vers = []
  46. text = open(0).read().strip()
  47. stream = iter(''.join(f'{int(char, 16):0>4b}' for char in text))
  48. ans = consume(stream)
  49. print(sum(vers))
  50. print(ans)