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

Day 6

y2021/day-06.livemd

Day 6

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])

Input

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

Recursor

defmodule Recursor do
  def recur(timer_frequencies, 0) do
    timer_frequencies
    |> Enum.reduce(0, fn {_k, count}, acc -> acc + count end)
  end

  def recur(timer_frequencies, times) do
    new_timer_frequencies =
      timer_frequencies
      |> Enum.reduce(%{}, fn {timer, count}, acc ->
        case timer do
          0 ->
            acc
            |> Map.update(6, count, &(&1 + count))
            |> Map.update(8, count, &(&1 + count))

          x ->
            Map.update(acc, x - 1, count, &(&1 + count))
        end
      end)

    recur(new_timer_frequencies, times - 1)
  end
end

Part 1

input
|> Kino.Input.read()
|> String.split(",", trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.frequencies()
|> Recursor.recur(80)

Part 2

input
|> Kino.Input.read()
|> String.split(",", trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.frequencies()
|> Recursor.recur(256)