advent_of_code/elixir/lib/Y2022/day3.ex
2024-11-15 21:03:49 -05:00

46 lines
881 B
Elixir

defmodule Day3 do
def init_state(part) do
%{sum: 0, part: part}
end
defp find_duplicates(line) do
line
|> String.to_charlist()
|> Enum.chunk_every(Integer.floor_div(String.length(line), 2))
|> Enum.map(&MapSet.new/1)
|> then(fn [a, b] -> MapSet.intersection(a, b) end)
|> MapSet.to_list()
end
defp to_priority(c) do
if is_nil(c) do
0
else
if c < 97 do
c - 38
else
c - 96
end
end
end
def execute(line, state) do
increment_sum = fn s -> Map.update(state, :sum, 0, &(&1 + s)) end
trimmed = line |> String.trim()
unless String.length(trimmed) == 0 do
trimmed
|> find_duplicates()
|> Enum.map(&to_priority(&1))
|> Enum.reduce(&(&1 + &2))
|> increment_sum.()
else
state
end
end
def get_answer(state) do
state.sum
end
end