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

Day 7

y2021/day-07.livemd

Day 7

Setup

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

Input

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

Part 1

frequencies =
  input
  |> Kino.Input.read()
  |> String.split(",")
  |> Enum.map(&String.to_integer/1)
  |> Enum.frequencies()
  |> Enum.to_list()

frequencies
|> Stream.cycle()
|> Stream.chunk_every(length(frequencies), 1)
|> Stream.take(length(frequencies))
|> Enum.reduce(:infinity, fn [{n, _} | rest_frequencies], acc ->
  count =
    rest_frequencies
    |> Enum.map(fn {x, freq} ->
      abs(x - n) * freq
    end)
    |> Enum.sum()

  if count < acc, do: count, else: acc
end)

Part 2

frequencies
|> Stream.cycle()
|> Stream.chunk_every(length(frequencies), 1)
|> Stream.take(length(frequencies))
|> Enum.reduce(:infinity, fn [{n, _} | rest_frequencies], acc ->
  count =
    rest_frequencies
    |> Enum.map(fn {x, freq} ->
      abs(x - n) * (abs(x - n) + 1) / 2 * freq
    end)
    |> Enum.sum()

  if count < acc, do: count, else: acc
end)
|> trunc()