diff options
Diffstat (limited to '2020/aoc2020-d22.py')
| -rw-r--r-- | 2020/aoc2020-d22.py | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/2020/aoc2020-d22.py b/2020/aoc2020-d22.py new file mode 100644 index 0000000..01b9a4c --- /dev/null +++ b/2020/aoc2020-d22.py @@ -0,0 +1,74 @@ +#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 +'''); |
