Powered by AppSignal & Oban Pro

Day 6: Lanternfish

2021/day_06_lanternfish.livemd

Day 6: Lanternfish

Mix.install([:kino])

input = Kino.Input.textarea("Please paste your input:")

Part 1

https://adventofcode.com/2021/day/6

Setup

inputs =
  input
  |> Kino.Input.read()
  |> String.split([",", "\n"], trim: true)
  |> Enum.map(&String.to_integer/1)

Solve: Part 1

timer_count_map =
  inputs
  |> Enum.reduce(%{}, fn timer, timer_count_map ->
    timer_count_map
    |> Map.update(timer, 1, &(&1 + 1))
  end)

timer_count_map =
  0..8
  |> Enum.map(&{&1, 0})
  |> Map.new()
  |> Map.merge(timer_count_map)

1..80
|> Enum.reduce(timer_count_map, fn _day, timer_count_map ->
  zero_count = Map.get(timer_count_map, 0, 0)

  timer_count_map
  |> Enum.map(fn
    {_timer = 0, count} -> {8, count}
    {timer, count} -> {timer - 1, count}
  end)
  |> Map.new()
  |> Map.update!(6, &(&1 + zero_count))
end)
|> Map.values()
|> Enum.sum()

Part 2

https://adventofcode.com/2021/day/6#part2

Solve: Part 2

1..256
|> Enum.reduce(timer_count_map, fn _day, timer_count_map ->
  zero_count = Map.get(timer_count_map, 0, 0)

  timer_count_map
  |> Enum.map(fn
    {_timer = 0, count} -> {8, count}
    {timer, count} -> {timer - 1, count}
  end)
  |> Map.new()
  |> Map.update!(6, &(&1 + zero_count))
end)
|> Map.values()
|> Enum.sum()