Powered by AppSignal & Oban Pro

Day 6

2021/notebooks/day-06.livemd

Day 6

Setup

input = Aoc.get_input(6)
textarea = Kino.Input.textarea("Puzzle input", default: input)
test_textarea = Kino.Input.textarea("Test input")
options = [
  puzzle: "Puzzle",
  test: "Test"
]

select = Kino.Input.select("Input source", options)
lines =
  select
  |> Kino.Input.read()
  |> case do
    :puzzle -> input
    :test -> test_textarea |> Kino.Input.read()
  end
  |> String.trim()
  |> String.split(",", trim: true)
  |> Enum.map(&String.to_integer/1)

Part 1

freq = Enum.frequencies(lines)
n = 80

1..n
|> Enum.reduce(freq, fn _, acc ->
  new_fish = Map.get(acc, 0, 0)

  acc
  |> Enum.reduce(%{}, fn
    {0, count}, acc ->
      Map.update(acc, 6, count, &(&1 + count))

    {day, count}, acc ->
      Map.update(acc, day - 1, count, &(&1 + count))
  end)
  |> Enum.into(%{})
  |> Map.put(8, new_fish)
end)
|> Map.values()
|> Enum.sum()

Part 2

Same solution from part 1 but with $n = 256$.

freq = Enum.frequencies(lines)
n = 256

1..n
|> Enum.reduce(freq, fn _, acc ->
  new_fish = Map.get(acc, 0, 0)

  acc
  |> Enum.reduce(%{}, fn
    {0, count}, acc ->
      Map.update(acc, 6, count, &(&1 + count))

    {day, count}, acc ->
      Map.update(acc, day - 1, count, &(&1 + count))
  end)
  |> Enum.into(%{})
  |> Map.put(8, new_fish)
end)
|> Map.values()
|> Enum.sum()