diff --git a/lib/day3.ex b/lib/day3.ex new file mode 100644 index 0000000..befc7ab --- /dev/null +++ b/lib/day3.ex @@ -0,0 +1,40 @@ +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 + u = if is_nil(c) do 0 else if c < 97 do c - 38 else c - 96 end end + u + 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 + diff --git a/main.exs b/main.exs index 98fd10b..a5598de 100644 --- a/main.exs +++ b/main.exs @@ -1 +1 @@ -AOCRunner.run(Day2, :part2) +AOCRunner.run(Day3, :part1)