Powered by AppSignal & Oban Pro

Day 3: Rucksack Reorganization

2022/day03.livemd

Day 3: Rucksack Reorganization

Mix.install([:kino])

Section

input = Kino.Input.textarea("Input")
dict =
  for(c <- Enum.concat(?a..?z, ?A..?Z), do: <<c>>)
  |> Enum.with_index(fn el, i -> {el, i + 1} end)
  |> Map.new()

rucksacks =
  input
  |> Kino.Input.read()
  |> String.split("\n")
  |> Enum.map(&String.graphemes/1)

Part 1

rucksacks
|> Enum.reduce(0, fn rucksack, sum ->
  rucksack
  |> Enum.split(rucksack |> length |> div(2))
  |> then(fn {left, right} ->
    MapSet.intersection(MapSet.new(left), MapSet.new(right))
  end)
  |> Enum.at(0)
  |> then(fn badge ->
    sum + Map.get(dict, badge)
  end)
end)

Part 2

rucksacks
|> Enum.map(&MapSet.new/1)
|> Enum.chunk_every(3)
|> Enum.reduce(0, fn [a, b, c], sum ->
  sum + Map.get(dict, Enum.at(a |> MapSet.intersection(b) |> MapSet.intersection(c), 0))
end)