def load_data(file): with open(file) as f: data = f.read() return list(data.split()) def update_stone(stone): if stone == "0": return ["1"] elif len(stone) % 2 == 0: L = len(stone) first_half = str(int(stone[:L//2])) second_half = str(int(stone[L//2:])) return [first_half, second_half] else: return [str(int(stone)*2024)] def blink(stones): new_stones = [] for stone in stones: next_stones = update_stone(stone) new_stones.extend(next_stones) return new_stones stones = load_data("input.txt") blinks = 25 for i in range(blinks): stones = blink(stones) print(len(stones)) ## Part two # Use a dict to keep track instead of a list def get_counts(stones): counts = {} for stone in stones: counts[stone] = counts.get(stone, 0) + 1 return counts def blink(stone_counts): new_counts = {} for stone, count in stone_counts.items(): new_stones = update_stone(stone) for s in new_stones: new_counts[s] = new_counts.get(s, 0) + 1 * count return new_counts def get_total_stones(stone_counts): total = 0 for stone, count in stone_counts.items(): total += count return total stones = load_data("input.txt") stone_counts = get_counts(stones) blinks = 75 for idx in range(blinks): stone_counts = blink(stone_counts) print(get_total_stones(stone_counts))