2024-12-11 - Plutonian Pebbles
(original .ipynb)from collections import defaultdict puzzle_input_str = "0 4 4979 24 4356119 914 85734 698829" test_input_str = """125 17""" def parse_input(input_str): return input_str.split(" ") def apply_rules(stone): if stone == "0": return ["1"] elif len(stone) % 2 == 0: pivot = len(stone) // 2 return [ str(int("".join(stone[:pivot]))), str(int("".join(stone[pivot:]))) ] else: number = int("".join(stone)) * 2024 return [str(number)] def solve(input_str, iterations): stones = parse_input(input_str) stone_counts = defaultdict(lambda:0) for stone in stones: stone_counts[stone] += 1 while iterations > 0: next_stone_counts = defaultdict(lambda:0) for stone, count in stone_counts.items(): for next_stone in apply_rules(stone): next_stone_counts[next_stone] += count stone_counts = next_stone_counts iterations -= 1 return sum(value for key, value in stone_counts.items()) def part_one(input_str): return solve(input_str, 25) assert 55312 == part_one(test_input_str) print("part one:", part_one(puzzle_input_str))
part one: 188902
def part_two(input_str): return solve(input_str, 75) print("part two:", part_two(puzzle_input_str))
part two: 223894720281135