Powered by AppSignal & Oban Pro

Advent of code day 06

2025/livebooks/day-06.livemd

Advent of code day 06

Mix.install([
  {:kino, "~> 0.5.0"}
])

Setup input

example = Kino.Input.textarea("Please paste your input example:")
input = Kino.Input.textarea("Please paste your real input:")

Part 01

example
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Enum.map(&String.split(&1, " ", trim: true))
|> Enum.zip_with(&Function.identity/1)
|> Enum.reduce(0, fn list, acc ->
  [operator | nums] = Enum.reverse(list)

  case operator do
    "*" ->
      Enum.map(nums, &String.to_integer/1)
      |> Enum.reduce(1, fn x, acc -> x * acc end)
      |> then(fn v -> v + acc end)

    "+" ->
      Enum.map(nums, &String.to_integer/1) |> Enum.sum() |> then(fn v -> v + acc end)
  end
end)

Part 02

example
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Enum.map(&String.split(&1, "", trim: true))
|> Enum.zip_with(&Function.identity/1)
|> Enum.chunk_by(fn x -> Enum.all?(x, fn v -> " " == v end) end)
|> Enum.filter(fn e -> length(e) > 1 end)
|> Enum.reduce(0, fn list, acc ->
  [first_num | _] = list
  [op | _] = Enum.reverse(first_num)

  val =
    case op do
      "*" ->
        Enum.reduce(list, 1, fn number, acc ->
          digits =
            Enum.filter(number, fn n ->
              case Integer.parse(n) do
                :error -> false
                _ -> true
              end
            end)

          Enum.join(digits) |> String.to_integer() |> Kernel.*(acc)
        end)

      "+" ->
        Enum.reduce(list, 0, fn number, acc ->
          digits =
            Enum.filter(number, fn n ->
              case Integer.parse(n) do
                :error -> false
                _ -> true
              end
            end)

          Enum.join(digits) |> String.to_integer() |> Kernel.+(acc)
        end)
    end

  val + acc
end)