/ Python / 2020 / 22.py
22.py
 1  from lib import *
 2  
 3  input = read_input(2020, 22)
 4  
 5  
 6  p1, p2 = [[*map(int, x.splitlines()[1:])] for x in input.split("\n\n")]
 7  while p1 and p2:
 8      if p1[0] > p2[0]:
 9          p1.append(p1.pop(0))
10          p1.append(p2.pop(0))
11      else:
12          p2.append(p2.pop(0))
13          p2.append(p1.pop(0))
14  
15  print(sum((i + 1) * x for i, x in enumerate(reversed(p1 or p2))))
16  
17  
18  def combat(p1, p2):
19      seen = set()
20      while p1 and p2:
21          if (k := (tuple(p1), tuple(p2))) in seen:
22              return 0, None
23          seen.add(k)
24          c1 = p1.pop(0)
25          c2 = p2.pop(0)
26          if len(p1) >= c1 and len(p2) >= c2:
27              winner, _ = combat(p1[:c1], p2[:c2])
28          else:
29              winner = c2 > c1
30          if not winner:
31              p1.append(c1)
32              p1.append(c2)
33          else:
34              p2.append(c2)
35              p2.append(c1)
36      return bool(p2), p1 or p2
37  
38  
39  p1, p2 = [[*map(int, x.splitlines()[1:])] for x in input.split("\n\n")]
40  _, p = combat(p1, p2)
41  print(sum((i + 1) * x for i, x in enumerate(reversed(p))))