Performance on my fingertips
defmodule AOC do
def priority(x) when x >= ?a, do: x - ?a + 1
def priority(x), do: x - ?A + 27
def traverse(string, line \\ [], group \\ [], score \\ 0) do
case string do
x when x in ["\n", ""] ->
score + score_group([line | group])
<<"\n", tail :: binary()>> ->
case group do
[_, _] ->
traverse(tail, [], [], score_group([line | group]) + score)
_ ->
traverse(tail, [], [line | group], score)
end
<<char, tail :: binary()>> ->
traverse(tail, [priority(char) | line], group, score)
end
end
defp score_group([one, two, three]) do
founds = unquote {:{}, [], List.duplicate(0, 52)}
founds = score_one(one, founds)
founds = score_two(two, founds)
score_three(three, founds)
end
defp score_one([head | tail], founds) do
score_one(tail, :erlang.setelement(head, founds, 1))
end
defp score_one([], founds), do: founds
defp score_two([head | tail], founds) when :erlang.element(head, founds) == 1 do
score_two(tail, :erlang.setelement(head, founds, 2))
end
defp score_two([_ | tail], founds) do
score_two(tail, founds)
end
defp score_two(_, founds), do: founds
defp score_three([head | tail], founds) when :erlang.element(head, founds) == 2 do
head
end
defp score_three([_ | tail], founds) do
score_three(tail, founds)
end
end
IO.inspect AOC.traverse IO.read :eof