22_spacecards.py 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/env python3
  2. import sys
  3. from collections import deque
  4. def parse(f):
  5. for deck in f.read().split('\n\n'):
  6. yield list(map(int, deck.splitlines()[1:]))
  7. def play(a, b, rec):
  8. a = deque(a)
  9. b = deque(b)
  10. seen = set()
  11. while a and b:
  12. if rec:
  13. config = tuple(a) + (0,) + tuple(b)
  14. if config in seen:
  15. return True, a
  16. seen.add(config)
  17. ca = a.popleft()
  18. cb = b.popleft()
  19. if rec and ca <= len(a) and cb <= len(b):
  20. reca = [a[i] for i in range(ca)]
  21. recb = [b[i] for i in range(cb)]
  22. a_wins_round = play(reca, recb, True)[0]
  23. else:
  24. a_wins_round = ca > cb
  25. if a_wins_round:
  26. a.extend((ca, cb))
  27. else:
  28. b.extend((cb, ca))
  29. return bool(a), a or b
  30. def score(a, b, rec):
  31. a_wins, deck = play(a, b, rec)
  32. return sum((len(deck) - i) * c for i, c in enumerate(deck))
  33. a, b = parse(sys.stdin)
  34. print(score(a, b, False))
  35. print(score(a, b, True))