From 8ff3b4faa092e90713d0a8027b9ca86544ef2d54 Mon Sep 17 00:00:00 2001 From: dece Date: Wed, 23 Dec 2020 03:11:17 +0100 Subject: [PATCH] Day 22 --- 2020/day22.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2020/new.py | 2 -- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 2020/day22.py diff --git a/2020/day22.py b/2020/day22.py new file mode 100644 index 0000000..ac696bb --- /dev/null +++ b/2020/day22.py @@ -0,0 +1,57 @@ +import sys + +def main(): + lines = [line.rstrip() for line in sys.stdin] + deck1, deck2 = parse_lines(lines) + + # Part 1 + while deck1 and deck2: + c1, c2 = deck1.pop(0), deck2.pop(0) + if c1 > c2: + deck1 += [c1, c2] + else: + deck2 += [c2, c1] + deck_win = deck1 or deck2 + print("Score:", score(deck_win)) + + # Part 2 + deck1, deck2 = parse_lines(lines) + winner = rec_game(deck1, deck2) + deck_win = deck1 if winner == 1 else deck2 + print("Score:", score(deck_win)) + +def parse_lines(lines): + deck1, deck2 = [], [] + for line in lines: + if not line: + continue + if line.startswith("P"): + deck = deck1 if int(line[7:8]) == 1 else deck2 + else: + deck.append(int(line)) + return deck1, deck2 + +def score(deck): + return sum(c * (i + 1) for i, c in enumerate(reversed(deck))) + +def rec_game(deck1, deck2): + past_decks = set() + while deck1 and deck2: + h = tuple(deck1), tuple(deck2) + if h in past_decks: + return 1 + past_decks.add(h) + c1, c2 = deck1.pop(0), deck2.pop(0) + if len(deck1) >= c1 and len(deck2) >= c2: + if rec_game(deck1[:c1], deck2[:c2]) == 1: + deck1 += [c1, c2] + else: + deck2 += [c2, c1] + elif c1 > c2: + deck1 += [c1, c2] + else: + deck2 += [c2, c1] + return 1 if deck1 else 2 + +if __name__ == "__main__": + main() diff --git a/2020/new.py b/2020/new.py index 029d26a..7f33985 100755 --- a/2020/new.py +++ b/2020/new.py @@ -6,11 +6,9 @@ from datetime import date TEMPLATE = """\ import sys - def main(): lines = [line.rstrip() for line in sys.stdin] - if __name__ == "__main__": main() """