Advent of Code 2024 - Day 3

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
1 Like