summaryrefslogtreecommitdiff
path: root/2020/aoc2020-d22.py
diff options
context:
space:
mode:
authorblenovo <bk@gmail.com>2025-08-06 00:51:06 +0200
committerblenovo <bk@gmail.com>2025-08-06 00:51:06 +0200
commit0a441ce2306ae9edefb009fbc0596f4d511cdc7f (patch)
tree11d5aca4383bbce8a35acb912698f473b8180215 /2020/aoc2020-d22.py
parent12f551dbfef138880b29ba6abe4576714ae942cb (diff)
summertime warmup session - finish
Diffstat (limited to '2020/aoc2020-d22.py')
-rw-r--r--2020/aoc2020-d22.py74
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
+''');