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

day-3

advent_of_code_2022/day3.livemd

day-3

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

Section

input = Kino.Input.textarea("Data")
letters = ~w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
upcase_letters = Enum.map(letters, &String.upcase/1)

priorities =
  letters
  |> Enum.concat(upcase_letters)
  |> Enum.with_index()
  |> Enum.map(fn {letter, index} -> {letter, index + 1} end)
  |> Map.new()
rucksacks =
  input
  |> Kino.Input.read()
  |> String.split("\n")
  |> Enum.map(&String.split(&1, ""))
  |> Enum.map(&Enum.reject(&1, fn letter -> letter == "" end))

Part 1

rucksacks
|> Enum.map(fn rucksack ->
  size = rucksack |> Enum.count() |> Kernel./(2) |> Kernel.floor()
  {compartment_a, compartment_b} = Enum.split(rucksack, size)

  compartment_a
  |> Enum.filter(fn item ->
    Enum.any?(compartment_b, &(&1 == item))
  end)
  |> Enum.uniq()
  |> Enum.map(&priorities[&1])
end)
|> List.flatten()
|> Enum.sum()

Part 2

rucksacks
|> Enum.chunk_every(3)
|> Enum.map(fn [r_1, r_2, r_3] ->
  r_1
  |> Enum.find(fn item ->
    Enum.any?(r_2, &(&1 == item)) and
      Enum.any?(r_3, &(&1 == item))
  end)
end)
|> Enum.map(&priorities[&1])
|> Enum.sum()