| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #!/usr/bin/env python3
- import sys
- from collections import deque
- def parse(f):
- for deck in f.read().split('\n\n'):
- yield list(map(int, deck.splitlines()[1:]))
- def play(a, b, rec):
- a = deque(a)
- b = deque(b)
- seen = set()
- while a and b:
- if rec:
- config = tuple(a) + (0,) + tuple(b)
- if config in seen:
- return True, a
- seen.add(config)
- ca = a.popleft()
- cb = b.popleft()
- if rec and ca <= len(a) and cb <= len(b):
- reca = [a[i] for i in range(ca)]
- recb = [b[i] for i in range(cb)]
- a_wins_round = play(reca, recb, True)[0]
- else:
- a_wins_round = ca > cb
- if a_wins_round:
- a.extend((ca, cb))
- else:
- b.extend((cb, ca))
- return bool(a), a or b
- def score(a, b, rec):
- a_wins, deck = play(a, b, rec)
- return sum((len(deck) - i) * c for i, c in enumerate(deck))
- a, b = parse(sys.stdin)
- print(score(a, b, False))
- print(score(a, b, True))
|