from functools import reduce def yield_numbers(line: str, target: int): nums = [None]*target turn = 0 last_spoken = 0 for starting in map(int, line.split(",")): nums[last_spoken] = turn turn += 1 last_spoken = starting yield turn, last_spoken, nums for t in range(turn, target): n = t - nums[last_spoken] if nums[last_spoken] is not None else 0 nums[last_spoken] = t last_spoken = n yield t+1, last_spoken, nums def get_target(line: str, target: int): return reduce(lambda a, b: b, yield_numbers(line, target))