Part 1:
defmodule Part1 do
def scan(input) do
Regex.scan(~r/mul\((\d{1,3}),(\d{1,3})\)/, input, capture: :all_but_first)
|> Enum.reduce(0, fn [a, b], acc ->
acc + String.to_integer(a) * String.to_integer(b)
end)
end
end
Part 2:
defmodule Part2 do
def scan(input, enabled \\ :enabled, acc \\ 0)
def scan(input, :enabled, acc) do
case Regex.split(~r/don't\(\)/, input, parts: 2) do
[valid, rest] -> scan(rest, :disabled, acc + Part1.scan(valid))
[valid] -> acc + Part1.scan(valid)
end
end
def scan(input, :disabled, acc) do
case Regex.split(~r/do\(\)/, input, parts: 2) do
[_invalid, rest] -> scan(rest, :enabled, acc)
[_invalid] -> acc
end
end
end