#!/usr/bin/env python3 import sys def step(deck1, deck2): new1, new2 = [x for x in deck1[1:]], [y for y in deck2[1:]] if deck1[0] > deck2[0]: new1.append(deck1[0]) new1.append(deck2[0]) else: new2.append(deck2[0]) new2.append(deck1[0]) return new1, new2 def game(deck1, deck2): while len(deck1) > 0 and len(deck2) > 0: deck1, deck2 = step(deck1, deck2) if len(deck1) > 0: return "1", deck1 else: return "2", deck2 def recursive_game(deck1, deck2): comb = [] while True: if len(deck1) == 0: return 'player2', deck2 if len(deck2) == 0: return 'player1', deck1 new1, new2 = [x for x in deck1[1:]], [y for y in deck2[1:]] if (deck1, deck2) in comb: return 'player1', deck1 comb.append((deck1, deck2)) if len(new1) >= deck1[0] and len(new2) >= deck2[0]: if recursive_game(deck1[1:(deck1[0]+1)], deck2[1:(deck2[0]+1)])[0] == 'player1': new1.append(deck1[0]) new1.append(deck2[0]) else: new2.append(deck2[0]) new2.append(deck1[0]) deck1, deck2 = [x for x in new1], [y for y in new2] else: deck1, deck2 = step(deck1, deck2) def score(deck): count = 0 for i, n in enumerate(deck): count += ((len(deck)-i) * n) return count if __name__ == '__main__': decks = open(sys.argv[1]).read() deck1, deck2 = decks.split('\n\n') deck1, deck2 = deck1.split('\n')[1:], deck2.split('\n')[1:-1] deck1, deck2 = [int(i) for i in deck1], [int(j) for j in deck2] rdeck1, rdeck2 = [x for x in deck1], [y for y in deck2] winner, windeck = game(deck1, deck2) print(winner, score(windeck)) winner, wdeck = recursive_game(rdeck1, rdeck2) print(winner, score(wdeck))