diff --git a/2023/elixir/lib/2023/3.ex b/2023/elixir/lib/2023/3.ex index 71314a6..0e15f78 100644 --- a/2023/elixir/lib/2023/3.ex +++ b/2023/elixir/lib/2023/3.ex @@ -31,7 +31,18 @@ aoc 2023, 3 do |> Enum.sum() end - def p2(_input) do + def p2(input) do + grid = + input + |> String.split("\n") + |> Enum.map(&String.to_charlist/1) + |> to_grid() + + for {coord, "*"} <- grid, is_gear(grid, coord), reduce: 0 do + sum -> + {_, [a, b]} = neighboring_numbers(grid, coord) + sum + a * b + end end def to_grid(lines) do @@ -90,4 +101,28 @@ aoc 2023, 3 do {y, x} end end + + def neighboring_numbers(grid, coord, already_seen \\ MapSet.new()) do + for c <- neighboring_coords(coord), reduce: {already_seen, []} do + {seen, numbers} -> + case Map.get(grid, c) do + {id, n} -> + if MapSet.member?(seen, id) do + {seen, numbers} + else + {MapSet.put(seen, id), [n | numbers]} + end + + _ -> + {seen, numbers} + end + end + end + + def is_gear(grid, coord) do + case neighboring_numbers(grid, coord) do + {_, [_, _]} -> true + _ -> false + end + end end diff --git a/README.md b/README.md index 55cf7c1..8a4b0de 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ 1. [2020] **17/50** 🌟 1. [2021] **43/50** 🌟 1. [2022] **14/50** 🌟 -1. [2023] **5/50** 🌟 +1. [2023] **6/50** 🌟 [2015]: ./2015 [2017]: ./2017