Powered by AppSignal & Oban Pro

--- Day 6: Lanternfish ---

2021/day06.livemd

— Day 6: Lanternfish —

Setup

defmodule Setup do
  def get_input(prompt) do
    case IO.gets(prompt) do
      :eof -> ""
      line -> line <> get_input(prompt)
    end
  end
end
defmodule LanternFish do
  def part1(input) do
    Enum.reduce(1..80, input, fn _i, fishes ->
      fishes
      |> Enum.map(fn
        0 -> 6
        n -> n - 1
      end)
      |> Enum.concat(List.duplicate(8, Enum.count(fishes, &amp;(&amp;1 == 0))))

      # |> IO.inspect(label: "Day #{i}")
    end)
    |> Enum.count()
  end

  def part2(input) do
    fish_per_evolution =
      Map.new(0..8, &amp;{&amp;1, 0})
      |> Map.merge(Enum.frequencies(input))

    evolution_steps = 256

    Enum.reduce(1..evolution_steps, fish_per_evolution, fn
      _i, fish ->
        %{
          fish
          | 0 => fish[1],
            1 => fish[2],
            2 => fish[3],
            3 => fish[4],
            4 => fish[5],
            5 => fish[6],
            6 => fish[7] + fish[0],
            7 => fish[8],
            8 => fish[0]
        }
    end)
    |> Map.values()
    |> Enum.sum()
  end
end
Setup.get_input("Input")
|> String.split(["\n", ","], trim: true)
|> Enum.map(&amp;String.to_integer/1)
|> LanternFish.part1()
Setup.get_input("Input")
|> String.split(["\n", ","], trim: true)
|> Enum.map(&amp;String.to_integer/1)
|> LanternFish.part2()