Powered by AppSignal & Oban Pro

🎄 Year 2025 🔔 Day 06

elixir/notebooks/2025/day06.livemd

🎄 Year 2025 🔔 Day 06

Section

rows =
  File.read!("#{__DIR__}/../../../inputs/2025/day06.txt")
  |> String.split("\n", trim: true)
  |> Enum.map(&String.split(&1, " ", trim: true))
  |> Enum.zip()
  |> Enum.map(&Tuple.to_list/1)
  |> Enum.map(&Enum.reverse/1)
  |> then(fn row ->
    Enum.map(row, fn [operator | tail] -> {operator, Enum.map(tail, &String.to_integer/1)} end)
  end)

Part 1

rows
|> Enum.map(fn {operator, ns} ->
  case operator do
    "*" -> Enum.product(ns)
    "+" -> Enum.sum(ns)
  end
end)
|> Enum.sum()

Part 2

transposed_rows =
  File.read!("#{__DIR__}/../../../inputs/2025/day06.txt")
  |> String.split("\n", trim: true)
  |> Enum.map(&String.graphemes/1)
  |> Enum.zip()
  |> Enum.map(&Tuple.to_list/1)
  |> Enum.map(&Enum.reverse/1)
  |> Enum.map(&Enum.join/1)

transposed_rows
|> Enum.filter(fn row -> row |> String.trim() |> String.length() |> then(&(&1 > 0)) end)
|> Enum.map(fn <> <> rest ->
  num = String.reverse(rest) |> String.replace(" ", "") |> String.to_integer()
  {operator, num}
end)
|> then(fn [{operator, num} | tail] ->
  Enum.reduce(tail, [{operator, [num]}], fn {op, num}, [{prev_op, ns} | acc_tail] ->
    if op == " " do
      [{prev_op, [num | ns]} | acc_tail]
    else
      [{op, [num]}, {prev_op, ns} | acc_tail]
    end
  end)
end)
|> Enum.map(fn {operator, ns} ->
  case operator do
    "+" -> Enum.sum(ns)
    "*" -> Enum.product(ns)
  end
end)
|> Enum.sum()