Powered by AppSignal & Oban Pro

AOC 2024

2024/day01.livemd

AOC 2024

Mix.install([
  {:kino_aoc, "~> 0.1"}
])

Day 1

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2024", "1", System.fetch_env!("LB_AOC_SESSION"))
defmodule Day01 do
  def final_distance(input) do
    {left_list, right_list} =
      input
      |> parse()
      |> Enum.unzip()

    left_sorted = Enum.sort(left_list)
    right_sorted = Enum.sort(right_list)

    Enum.reduce(Enum.zip(left_sorted, right_sorted), 0, fn {l, r}, acc ->
      acc + abs(l - r)
    end)
  end

  def part2(input) do
    all = parse(input)
    {first, second} = Enum.unzip(all)
    frequencies = Enum.frequencies(second)
    first
    |> Enum.map(fn n ->
      n * Map.get(frequencies, n, 0)
    end)
    |> Enum.sum
  end

  defp parse(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(fn line ->
      line
      |> String.split()
      |> Enum.map(&String.to_integer/1)
      |> List.to_tuple() 
    end)
  end
end