2023 day 3
This commit is contained in:
parent
5d59234db4
commit
c7b996aea5
1 changed files with 54 additions and 0 deletions
54
lib/2023_day3.exs
Normal file
54
lib/2023_day3.exs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
contains_symbol = fn s ->
|
||||||
|
match = Regex.match?(~r/[^\d.]/, s)
|
||||||
|
match
|
||||||
|
end
|
||||||
|
|
||||||
|
grab_numbers = fn line ->
|
||||||
|
Regex.scan(~r/\d+/, line, return: :index)
|
||||||
|
|> Enum.map(fn [{index, len}] ->
|
||||||
|
{index, len, line |> String.slice(index, len) |> Integer.parse() |> elem(0)}
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
part1 = fn s ->
|
||||||
|
for [pre, curr, post] <-
|
||||||
|
s
|
||||||
|
|> Enum.reject(&(String.length(&1) == 0))
|
||||||
|
|> then(fn x -> Enum.concat([""], x) end)
|
||||||
|
|> Enum.chunk(3, 1)
|
||||||
|
|> Enum.map(fn u -> Enum.map(u, &String.trim/1) end),
|
||||||
|
[{index, length}] <- Regex.scan(~r/\d+/, curr, return: :index),
|
||||||
|
contains_symbol.(String.slice(curr, max(index - 1, 0), length + 2)) ||
|
||||||
|
contains_symbol.(String.slice(pre, max(index - 1, 0), length + 2)) ||
|
||||||
|
contains_symbol.(String.slice(post, max(index - 1, 0), length + 2)),
|
||||||
|
{number, _} = String.slice(curr, index, length) |> Integer.parse() do
|
||||||
|
number
|
||||||
|
end
|
||||||
|
|> Enum.sum()
|
||||||
|
end
|
||||||
|
|
||||||
|
part2 = fn s ->
|
||||||
|
for [pre, curr, post] <-
|
||||||
|
s
|
||||||
|
|> Enum.reject(&(String.length(&1) == 0))
|
||||||
|
|> then(fn x -> Enum.concat([""], x) end)
|
||||||
|
|> then(fn x -> Enum.concat(x, [""]) end)
|
||||||
|
|> Enum.chunk(3, 1)
|
||||||
|
|> Enum.map(fn u -> Enum.map(u, &String.trim/1) end),
|
||||||
|
curr |> String.contains?("*"),
|
||||||
|
[{gear_idx, _}] <- Regex.scan(~r/\*/, curr, return: :index),
|
||||||
|
matches =
|
||||||
|
grab_numbers.(pre) |> Enum.concat(grab_numbers.(post)) |> Enum.concat(grab_numbers.(curr)),
|
||||||
|
valid_matches =
|
||||||
|
matches
|
||||||
|
|> Enum.filter(fn {m_idx, m_len, _} ->
|
||||||
|
gear_idx in max(0, m_idx - 1)..(m_idx + m_len)
|
||||||
|
end),
|
||||||
|
valid_matches |> Enum.count() == 2,
|
||||||
|
[{_, _, a}, {_, _, b}] = valid_matches do
|
||||||
|
a * b
|
||||||
|
end
|
||||||
|
|> Enum.sum()
|
||||||
|
end
|
||||||
|
|
||||||
|
part2.(IO.stream()) |> IO.puts()
|
Loading…
Add table
Reference in a new issue