Powered by AppSignal & Oban Pro

Day3

2024/elixir/day3.livemd

Day3

Mix.install([
  {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
])

Setup

{:ok, data} = KinoAOC.download_puzzle("2024", "3", System.fetch_env!("LB_AOC_SECRET"))

Solve

defmodule Day3 do
  @rr ~r/(mul\((\d+),(\d+)\)|don't\(\))|do\(\)/

  def parse(data) do
    @rr
    |> Regex.scan(data)
    |> Enum.map(&parse_row/1)
  end

  def parse_row([_, _, a, b]), do: {String.to_integer(a), String.to_integer(b)}
  def parse_row([_, "don't()"]), do: :off
  def parse_row(["do()"]), do: :on

  def solve(data) do
    pd = parse(data)
    task(pd, :t1) |> IO.inspect(label: "t1 >>>")
    task(pd, :t2) |> IO.inspect(label: "t2 >>>")
  end

  def task(data, task) do
    data
    |> Enum.reduce({[], :on, task}, &do_mul/2)
    |> elem(0)
    |> Enum.sum()
  end

  def do_mul(:on, {acc, _cmd, task}), do: {acc, :on, task}
  def do_mul(:off, {acc, _cmd, task}), do: {acc, :off, task}
  def do_mul({a, b}, {acc, cmd, :t1}), do: {[a*b | acc], cmd, :t1}
  def do_mul({a, b}, {acc, :on, :t2}), do: {[a*b | acc], :on, :t2}
  def do_mul({_a, _b}, {acc, :off, :t2}), do: {acc, :off, :t2}
end

tdata = """
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
"""

Day3.solve(tdata)
Day3.solve(data)