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

Day 1

2024/day_1.livemd

Day 1

Mix.install([:kino])

Get input

input =
  Kino.Input.textarea("Paste input here",
    default: """
      3   4
      4   3
      2   5
      1   3
      3   9
      3   3
    """
  )
parsed_input = input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(fn line ->
  line
  |> String.split(~r"\s", trim: true)
  |> Stream.map(&Integer.parse/1)
  |> Stream.map(fn {i, ""} -> i end)
  |> Enum.into([])
end)
processed_input =
  parsed_input
  |> Enum.zip_with(&Function.identity/1)
  |> Enum.map(&Enum.sort/1)

Part 1

processed_input
|> Enum.zip()
|> Enum.map(fn {a, b} -> abs(a - b) end)
|> Enum.sum()

Part 2

freqs = processed_input |> Enum.at(1) |> Enum.frequencies()

processed_input
|> Enum.at(0)
|> Enum.map(fn n -> n * Map.get(freqs, n, 0) end)
|> Enum.sum()