From 7f8895c2c1b638af36f05ca779c06e55f257d812 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Tue, 22 Dec 2020 08:38:38 +0100 Subject: [PATCH] day22 --- day22.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ inputs/22 | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ inputs/22_test | 13 ++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 day22.py create mode 100644 inputs/22 create mode 100644 inputs/22_test diff --git a/day22.py b/day22.py new file mode 100644 index 0000000..91895e9 --- /dev/null +++ b/day22.py @@ -0,0 +1,55 @@ +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) diff --git a/inputs/22 b/inputs/22 new file mode 100644 index 0000000..4aed5fe --- /dev/null +++ b/inputs/22 @@ -0,0 +1,53 @@ +Player 1: +31 +24 +5 +33 +7 +12 +30 +22 +48 +14 +16 +26 +18 +45 +4 +42 +25 +20 +46 +21 +40 +38 +34 +17 +50 + +Player 2: +1 +3 +41 +8 +37 +35 +28 +39 +43 +29 +10 +27 +11 +36 +49 +32 +2 +23 +19 +9 +13 +15 +47 +6 +44 diff --git a/inputs/22_test b/inputs/22_test new file mode 100644 index 0000000..391cd24 --- /dev/null +++ b/inputs/22_test @@ -0,0 +1,13 @@ +Player 1: +9 +2 +6 +3 +1 + +Player 2: +5 +8 +4 +7 +10