Part 1
r = ~r/mul\(([0-9]+?),([0-9]+?)\)/
for [n0, n1] <- Regex.scan(r, puzzle_input, capture: :all_but_first),
n0 = String.to_integer(n0),
n1 = String.to_integer(n1),
reduce: 0 do
acc -> acc + n0 * n1
end
Part 2
r = ~r/do\(\)|don't\(\)|mul\(([0-9]+?),([0-9]+?)\)/
for match <- Regex.scan(r, puzzle_input), reduce: {0, true} do
{acc, conditional} ->
case match do
["do()"] ->
{acc, true}
["don't()"] ->
{acc, false}
[_, n0, n1] ->
if conditional do
n0 = String.to_integer(n0)
n1 = String.to_integer(n1)
{acc + n0 * n1, conditional}
else
{acc, conditional}
end
end
end