Advent 2022 - Day 3
Mix.install([
{:kino, github: "livebook-dev/kino"}
])
:ok
Setup
input = Kino.Input.textarea("Please paste your input file:")
rucksacks =
input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Enum.map(&String.split(&1, "", trim: true))
[
["v", "J", "r", "w", "p", "W", "t", "w", "J", "g", "W", "r", "h", "c", "s", "F", "M", "M", "f",
"F", "F", "h", "F", "p"],
["j", "q", "H", "R", "N", "q", "R", "j", "q", "z", "j", "G", "D", "L", "G", "L", "r", "s", "F",
"M", "f", "F", "Z", "S", "r", "L", "r", "F", "Z", "s", "S", "L"],
["P", "m", "m", "d", "z", "q", "P", "r", "V", "v", "P", "w", "w", "T", "W", "B", "w", "g"],
["w", "M", "q", "v", "L", "M", "Z", "H", "h", "H", "M", "v", "w", "L", "H", "j", "b", "v", "c",
"j", "n", "n", "S", "B", "n", "v", "T", "Q", "F", "n"],
["t", "t", "g", "J", "t", "R", "G", "J", "Q", "c", "t", "T", "Z", "t", "Z", "T"],
["C", "r", "Z", "s", "J", "s", "P", "P", "Z", "s", "G", "z", "w", "w", "s", "L", "w", "L", "m",
"p", "w", "M", "D", "w"]
]
defmodule Rucksack do
def item_to_priority(item) do
item |> String.to_charlist() |> Enum.at(0) |> item_number_to_priority
end
def item_number_to_priority(number) when number >= 97, do: number - 96
def item_number_to_priority(number), do: number - 38
end
{:module, Rucksack, <<70, 79, 82, 49, 0, 0, 7, ...>>, {:item_number_to_priority, 1}}
Part 1
rucksacks
|> Enum.map(fn rucksack ->
rucksack
|> Enum.split(round(length(rucksack) / 2))
|> Tuple.to_list()
|> Enum.map(&MapSet.new(&1))
|> Enum.reduce(&MapSet.intersection(&1, &2))
|> Enum.at(0)
|> Rugsack.item_to_priority()
end)
|> Enum.sum()
157
Part 2
rucksacks
|> Enum.chunk_every(3)
|> Enum.map(fn rucksacks ->
rucksacks
|> Enum.map(&MapSet.new(&1))
|> Enum.reduce(&MapSet.intersection(&1, &2))
|> Enum.at(0)
|> Rugsack.item_to_priority()
end)
|> Enum.sum()
70