lanternfish_days =
"1,3,1,5,5,1,1,1,5,1,1,1,3,1,1,4,3,1,1,2,2,4,2,1,3,3,2,4,4,4,1,3,1,1,4,3,1,5,5,1,1,3,4,2,1,5,3,4,5,5,2,5,5,1,5,5,2,1,5,1,1,2,1,1,1,4,4,1,3,3,1,5,4,4,3,4,3,3,1,1,3,4,1,5,5,2,5,2,2,4,1,2,5,2,1,2,5,4,1,1,1,1,1,4,1,1,3,1,5,2,5,1,3,1,5,3,3,2,2,1,5,1,1,1,2,1,1,2,1,1,2,1,5,3,5,2,5,2,2,2,1,1,1,5,5,2,2,1,1,3,4,1,1,3,1,3,5,1,4,1,4,1,3,1,4,1,1,1,1,2,1,4,5,4,5,5,2,1,3,1,4,2,5,1,1,3,5,2,1,2,2,5,1,2,2,4,5,2,1,1,1,1,2,2,3,1,5,5,5,3,2,4,2,4,1,5,3,1,4,4,2,4,2,2,4,4,4,4,1,3,4,3,2,1,3,5,3,1,5,5,4,1,5,1,2,4,2,5,4,1,3,3,1,4,1,3,3,3,1,3,1,1,1,1,4,1,2,3,1,3,3,5,2,3,1,1,1,5,5,4,1,2,3,1,3,1,1,4,1,3,2,2,1,1,1,3,4,3,1,3"
|> String.split(",")
|> Enum.map(&String.to_integer/1)
Each lanternfish creates a new lanternfish once every 7 days.
A new lanternfish needs two more days before its first cycle.
rhythm = Enum.map(0..6, fn i -> {i, 0} end) |> Map.new()
fish = Map.merge(rhythm, Enum.frequencies(lanternfish_days))
defmodule Lanternfish do
def growth_rate(fish, _day, _, _, -1) do
fish
end
def growth_rate(fish, day, waiting1, waiting2, count) do
day = rem(day + 1, 7)
new_fish = fish[day]
fish = Map.update!(fish, day, &(&1 + waiting1))
growth_rate(fish, day, waiting2, new_fish, count - 1)
end
end
defmodule Fish do
def simulate(fish, days) do
fish
|> Lanternfish.growth_rate(0, 0, 0, days)
|> Map.values()
|> Enum.sum()
end
end
Fish.simulate(fish, 80)
Fish.simulate(fish, 256)
Fish.simulate(fish, 80) == 360_268 && Fish.simulate(fish, 256) == 1_632_146_183_902