This time we have to fight with crab and fighting with crab is easier. I quickly found the solution to part one and for the part two, I took help from here. So for the second part, credit goes to the author of that code. What was your solution? Please share it on comment.
Part 1
with open("day22.txt") as fp: lines = fp.read().split("\n\n") lines = {line.split(":")[0]: line.split(":")[1].strip() for line in lines} lines = {key: list(map(lambda x: int(x), value.split("\n"))) for key, value in lines.items()} card_dict = lines.copy() p1 = card_dict["Player 1"] p2 = card_dict["Player 2"] i = 0 while len(p1) != 0 or len(p2) != 0: print(f"Iteration {i}, P1: {p1}, P2: {p2}") c1 = p1[0] c2 = p2[0] del p1[0] del p2[0] if c1 > c2: p1.append(c1) p1.append(c2) else: p2.append(c2) p2.append(c1) i+=1 if len(p1) == 0 or len(p2) == 0: break if len(p1) == 0: part1_sum = sum([((i+1)*j) for i, j in enumerate(p2[::-1])]) else: part1_sum = sum([((i+1)*j) for i, j in enumerate(p1[::-1])]) part1_sum
Part 2
def recursive_war(p1cards, p2cards, visited): while(len(p1cards) > 0 and len(p2cards) > 0): if (tuple(p1cards), tuple(p2cards)) in visited: return 1, p1cards visited.add((tuple(p1cards), tuple(p2cards))) a, b = p1cards.pop(0), p2cards.pop(0) if len(p1cards) >= a and len(p2cards) >= b: winner, _ = recursive_war(p1cards[:a], p2cards[:b], set()) else: winner = 1 if a > b else 0 if winner == 1: p1cards.extend([a, b]) else: p2cards.extend([b, a]) return (1, p1cards) if len(p1cards) > 0 else (0, p2cards) print(sum((i + 1) * x for i, x in enumerate(recursive_war(card_dict["Player 1"], card_dict["Player 2"] , set())[1][::-1])))
Top comments (0)