Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 6

2021/day_06.livemd

Day 6

Input

Mix.install([
  {:kino, github: "livebook-dev/kino"}
])
textarea = Kino.Input.textarea("Input:")

Common

defmodule Common do
  def parse_input(raw_input) do
    raw_input
    |> String.split(",", trim: true)
    |> Enum.map(&String.to_integer/1)
  end

  def iterate(frequencies, 0) do
    frequencies
    |> Map.values()
    |> Enum.sum()
  end

  def iterate(frequencies, days_left) do
    zeros_count = frequencies[0] || 0

    frequencies =
      Enum.reduce(0..7, frequencies, fn time, frequencies ->
        Map.put(frequencies, time, frequencies[time + 1] || 0)
      end)

    frequencies =
      frequencies
      |> Map.put(8, zeros_count)
      |> Map.update(6, zeros_count, &(&1 + zeros_count))

    iterate(frequencies, days_left - 1)
  end
end
raw_input = Kino.Input.read(textarea)
input = Common.parse_input(raw_input)

Part 1

defmodule Part1 do
  def run(input) do
    input
    |> Enum.frequencies()
    |> Common.iterate(80)
  end
end
Part1.run(input)

Part 2

defmodule Part2 do
  def run(input) do
    input
    |> Enum.frequencies()
    |> Common.iterate(256)
  end
end
Part2.run(input)