import sys from collections import defaultdict def matches2score(n): if n <= 0: return 0 return 2**(n-1) input = sys.stdin part1 = 0 card = 0 copies = defaultdict(int) for line in input: card += 1 _, _, data = line.partition(": ") winners, numbers = data.split("|") winners = map(int, winners.split()) numbers = map(int, numbers.split()) matches = len(set(winners) & set(numbers)) s = matches2score(matches) print(s) part1 += s copies[card] += 1 # original copy for i in range(matches): copies[card+i+1] += copies[card] print("-") print(part1) assert not [i for i,c in copies.items() if c > 0 and i > card] part2 = sum(copies.values()) print(part2)