import sys def naive(v, i): if not v: return 0 elif i == 0: return v[0] elif i > 0: return naive(v, i - 1) + naive(v[1:], i - 1) else: return naive(v, i + 1) - naive(v[1:], i) def closed(v, i): s = 0; base = 1 for k, x in enumerate(v): if k > 0: base *= (i - k + 1) / k s += x * base return int(s) def get_start_values(numbers): diff = [numbers[i + 1] - numbers[i] for i in range(len(numbers) - 1)] if all(x == 0 for x in diff): return [numbers[0]] else: return [numbers[0], *get_start_values(diff)] with open(sys.argv[1]) as fh: sum1 = 0 sum2 = 0 for line in fh: numbers = [int(s, 10) for s in line.split()] v = get_start_values(numbers) sum1 += closed(v, len(numbers)) sum2 += closed(v, -1) print(f'part1: {sum1}') print(f'part2: {sum2}') print(closed([0, 0, 0, 1], 5))