import aoclib DAY = 22 TEST_SOLUTION_PART1 = 306 TEST_SOLUTION_PART2 = 291 def play(player1_cards, player2_cards, recursive_combat=False): previous_rounds = set() while player1_cards and player2_cards: if recursive_combat: deck_tuple = (tuple(player1_cards), tuple(player2_cards)) if deck_tuple in previous_rounds: return 1, player1_cards else: previous_rounds.add(deck_tuple) card1 = player1_cards.pop(0) card2 = player2_cards.pop(0) if not recursive_combat: if card1 > card2: player1_cards.extend([card1, card2]) else: player2_cards.extend([card2, card1]) else: if len(player1_cards) >= card1 and len(player2_cards) >= card2: winner, _ = play(player1_cards.copy()[:card1], player2_cards.copy()[:card2], True) else: winner = 1 if card1 > card2 else 2 if winner == 1: player1_cards.extend([card1, card2]) else: player2_cards.extend([card2, card1]) winner = (1, player1_cards) if len(player1_cards) else (2, player2_cards) return winner def part1(test_mode=False, recursive_combat=False): my_input = aoclib.getMultiLineInputAsArray(day=DAY, test=test_mode) player1 = [int(x) for x in my_input[0][1:]] player2 = [int(x) for x in my_input[1][1:]] _, winner = play(player1, player2, recursive_combat) answer = 0 for x, c in enumerate(winner): answer += (len(winner) - x) * c return answer def part2(test_mode=False): return part1(test_mode, recursive_combat=True)