from collections import Counter def blink(data, steps): counter = Counter(data) for i in range(steps): new_counter = Counter() #data = tuple(x for y in (blink_stone(s) for s in data) for x in y) for stone, count in counter.items(): s = str(stone) if stone == 0: new_counter[1] += count elif len(s) % 2 == 0: first, second = int(s[:len(s)//2]), int(s[len(s)//2:]) new_counter[first] += count new_counter[second] += count else: new_counter[2024*stone] += count counter = new_counter print(len(counter.items())) return counter.total() if __name__ == "__main__": res = blink((125, 17), 25) assert res == 55312, f"expected 55312, but was {res}" import sys if len(sys.argv) > 1: infile = sys.argv[1] with open(infile) as f: data = tuple(map(int, f.read().rstrip().split())) part1 = blink(data, 25) print("Part 1: ", part1) part2 = blink(data, 75) print("Part 2: ", part2)