from toolkit import product def combine(qtys): return [max(0, sum(a * b for a, b in zip(qtys, vs))) for vs in zip(*data)] data = [ [int(n) for n in re.findall(r'-?\d+', ln)] for ln in df.read_text().splitlines() ] qtys = [ combine([A, B, C, 100 - A - B - C]) for A in range(101) for B in range(101 - A) for C in range(101 - A - B) ] ans1 = max(product(combo[:-1]) for combo in qtys) ans2 = max(product(combo[:-1]) for combo in qtys if combo[-1] == 500)