Advent of Code 2024 - Day 3

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