From 5b6b8bb55b8ed022f6c0b81a8b976d92ff6bda6d Mon Sep 17 00:00:00 2001 From: Caleb Webber Date: Sun, 29 Oct 2023 01:07:08 -0400 Subject: [PATCH] day 3 part 1 --- lib/day3.ex | 40 ++++++++++++++++++++++++++++++++++++++++ main.exs | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 lib/day3.ex 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)