Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day03

03.livemd

Day03

Section

defmodule Day03 do
  def mul(a, b), do: a * b
  def eval_mul(list) do
    list
    |> Enum.map(&amp;("Day03." <> &amp;1))
    |> Enum.join(" + ")
    |> Code.eval_string()
    |> elem(0)
  end

  def part1(input) do
    Regex.scan(~r/mul\(\d{1,3}\,\d{1,3}\)/, input)
    |> Enum.map(&amp;hd/1)
    |> eval_mul()
  end

  def part2(input) do
    Regex.scan(~r/mul\(\d{1,3}\,\d{1,3}\)|don\'t\(\)|do\(\)/, input)
    |> Enum.map(&amp;hd/1)
    |> Enum.reduce({:do, []}, fn
      "do()", {_, accu} -> {:do, accu}
      "don't()", {_, accu} -> {:dont, accu}
      hd, {:do, accu} -> {:do, [hd | accu]}
      _, {:dont, accu} -> {:dont, accu}
    end)
    |> elem(1)
    |> eval_mul()
  end
end

example1 = "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))"
Day03.part1(example1)
example2 = "xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))"
Day03.part2(example2)