## DEV Community is a community of 605,211 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

loading...

# Advent of Code 2020: Python Solution Day 22

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(":"): line.split(":").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
c2 = p2
del p1
del p2

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])))
``````

## Discussion (0) 