On day 6 we need to count the total number of fish after n days given that each fish can spawn another fish every 6 days.
The main challenge was handling exponential growth. So instead of tracking the fish, we need to track the counts of fish for each day.
- How many fish are there after 80 days of exponential growth
- How many fish are there after 256 days of exponential growth
The counts are tracked in a pair of dicts.
- One dict for the current day
- A second dict for the next day count
def simulate(timers, days=80): day_counts = dict(Counter(timers)) day = 0 while day < days: next_day_counts: Dict[int, int] = defaultdict(int) for f in range(1, 9): next_day_counts[f - 1] += day_counts.get(f, 0) next_day_counts += day_counts.get(0, 0) next_day_counts += day_counts.get(0, 0) day_counts = copy(next_day_counts) day += 1 return sum(list(day_counts.values()))
For part 1 we simulate for 80 days
def day6_1(timers): return simulate(timers, 80)
For part 2 we simulate over 256 days
def day6_2(timers): return simulate(timers, 256)