Skip to content

Latest commit

 

History

History
68 lines (49 loc) · 1.84 KB

day06.livemd

File metadata and controls

68 lines (49 loc) · 1.84 KB

Advent of Code 2021 - Day 6

Puzzle description

Lanternfish

Glowing lanternfish swim past

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)

Model their growth rate

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

How many lanternfish would there be after 80 days?

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)

After 256 days?

Fish.simulate(fish, 256)

Check

Fish.simulate(fish, 80) == 360_268 && Fish.simulate(fish, 256) == 1_632_146_183_902