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

Advent 2024 - Day 1

day1.livemd

Advent 2024 - Day 1

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

Setup

input = Kino.Input.textarea("Please paste your input file")
{left_list, right_list} =
  input
  |> Kino.Input.read()
  |> String.split("\n")
  |> Enum.map(fn line ->
    [l, r] = line
      |> String.split("  ")
      |> Enum.map(&(String.to_integer(String.trim(&1))))
    {l,r}
  end)
  |> Enum.unzip()

{left_list, right_list}

Part 1

Enum.zip(Enum.sort(left_list), Enum.sort(right_list))
  |> Enum.map(fn {l, r} ->
    abs(l - r)
  end)
  |> Enum.sum()

Part 2

right_list
  |> Enum.group_by(&(&1))
  |> Enum.map(fn {k, v} ->
    {k, Enum.count(v)}
  end)
  |> Map.new()
  |> IO.inspect(charlists: :as_lists)
right_counts = right_list
  |> Enum.group_by(&(&1))
  |> Enum.map(fn {k, v} ->
    {k, Enum.count(v)}
  end)
  |> Map.new()

for n <- left_list do
  n * Map.get(right_counts, n, 0)
end
|> Enum.sum()