Powered by AppSignal & Oban Pro

Day 3: Rucksack Reorganization

day-3-rucksack-reorganization.livemd

Day 3: Rucksack Reorganization

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

Input & Score

input = Kino.Input.textarea("Input")
score =
  ".abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  |> String.codepoints()
  |> Enum.with_index()

Part 1

Kino.Input.read(input)
|> String.split("\n")
|> Enum.map(&String.codepoints/1)
|> Enum.map(fn x ->
  Enum.chunk_every(x, div(length(x), 2))
  |> Enum.map(&MapSet.new/1)
  |> Enum.reduce(fn x, acc -> MapSet.intersection(acc, x) end)
  |> MapSet.to_list()
end)
|> List.flatten()
|> Enum.map(fn x ->
  Enum.find_value(score, fn {char, score} ->
    if char === x, do: score
  end)
end)
|> Enum.sum()

Part 2

Kino.Input.read(input)
|> String.split("\n")
|> Enum.map(&String.codepoints/1)
|> Enum.chunk_every(3)
|> Enum.map(fn chunks ->
  chunks
  |> Enum.map(&MapSet.new/1)
  |> Enum.reduce(fn x, acc -> MapSet.intersection(acc, x) end)
  |> MapSet.to_list()
end)
|> List.flatten()
|> Enum.map(fn x ->
  Enum.find_value(score, fn {char, score} ->
    if char === x, do: score
  end)
end)
|> Enum.sum()