#advent of code 2020 #day 22 #some problems with copying, modifying, accessing data between functions #had a bit of workarounds #Im too lazy to reduce the amount of code #by including part1 and part2 in a single function def NormalCombat(player1, player2): decks = dict(); decks[0] = player1.copy(); decks[1] = player2.copy(); while len(decks[0]) > 0 and len(decks[1]) > 0 : card0 = decks[0].pop(0); card1 = decks[1].pop(0); if card0 > card1: decks[0].append(card0); decks[0].append(card1); elif card0 < card1: decks[1].append(card1); decks[1].append(card0); score = 0; for deck in decks: if len(decks[deck]) == 0: continue; for c, card in enumerate(decks[deck]): score += (len(decks[deck])-c)*card break; return score; def RecursiveCombat(player1, player2): decks = dict(); decks[0] = player1.copy(); decks[1] = player2.copy(); previoushands = dict(); previoushands[0] = []; previoushands[1] = []; while len(decks[0]) > 0 and len(decks[1]) > 0 : if tuple(decks[0]) in previoushands[0] and tuple(decks[1]) in previoushands[1]: return 0, None; previoushands[0].append(tuple(decks[0])); previoushands[1].append(tuple(decks[1])); card0 = decks[0].pop(0); card1 = decks[1].pop(0); if card0 <= len(decks[0]) and card1 <= len(decks[1]): winner, winscore = RecursiveCombat(decks[0][:card0],decks[1][:card1]); elif card0 > card1: winner = 0; elif card0 < card1: winner = 1; playedcards = [card0,card1]; decks[winner].append(playedcards[winner]); decks[winner].append(playedcards[(winner+1)%2]); score = 0; for deck in decks: #print(decks[deck]); if len(decks[deck]) == 0: continue; for c, card in enumerate(decks[deck]): score += (len(decks[deck])-c)*card winplayer = 0 + deck; break; return winplayer, score; PuzzleInput = open("22.in","r").read(); playerdata1, playerdata2 = PuzzleInput.split("\n\n"); playerdecks = dict(); for pi, playerdata in enumerate( [playerdata1,playerdata2] ): playerdecks[pi] = [int(val) for val in playerdata.split("\n")[1:] if val != ""]; p1 = NormalCombat(playerdecks[0],playerdecks[1]); print("part 1 =",p1); _, p2 = RecursiveCombat(playerdecks[0],playerdecks[1]); print("part 2 =",p2); print('''part 1 = 34664 part 2 = 32018 ''');