Day03
Section
defmodule Day03 do
def mul(a, b), do: a * b
def eval_mul(list) do
list
|> Enum.map(&("Day03." <> &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(&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(&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)