AoC – Day 03
input = File.stream!("/Users/pw/src/weiland/adventofcode/2022/input/03.txt")
test_input = File.stream!("/Users/pw/src/weiland/adventofcode/2022/input/03test.txt")
Data preprocessing
parse_line = fn line ->
line
|> String.replace("\n", "")
|> String.split("", trim: true)
end
input =
input
|> Stream.map(parse_line)
# |> Enum.to_list()
# |> length()
Part one
calculate_priority = fn letter ->
char =
String.to_charlist(letter)
|> hd
# capital letter
# lowercase letter
if char >= 65 && char <= 90 do
char - 38
else
char - 96
end
end
find_duplicate = fn [comp1, comp2] ->
comp1
|> Enum.filter(fn item -> Enum.member?(comp2, item) end)
|> Enum.uniq()
|> List.first()
end
input
|> Stream.map(&Enum.chunk_every(&1, Integer.floor_div(Enum.count(&1), 2)))
|> Stream.map(find_duplicate)
|> Stream.map(calculate_priority)
|> Enum.sum()
Part two
find_badge = fn [comp1, comp2, comp3] ->
Enum.filter(comp1, fn item -> Enum.member?(comp2, item) && Enum.member?(comp3, item) end)
|> Enum.uniq()
|> List.first()
end
input
|> Enum.chunk_every(3)
|> Enum.map(find_badge)
|> Enum.map(calculate_priority)
|> Enum.sum()