Objective
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[6] += day_counts.get(0, 0)
next_day_counts[8] += day_counts.get(0, 0)
day_counts = copy(next_day_counts)
day += 1
return sum(list(day_counts.values()))
Part 1
For part 1 we simulate for 80 days
def day6_1(timers):
return simulate(timers, 80)
Part 2
For part 2 we simulate over 256 days
def day6_2(timers):
return simulate(timers, 256)