Powered by AppSignal & Oban Pro

Advent of code day 03

2025/livebooks/day-03.livemd

Advent of code day 03

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

Setup input

example = Kino.Input.textarea("Please paste your input example:")
input = Kino.Input.textarea("Please paste your real input:")
defmodule Solver do
  def max_subseq_k(seq, k) do
    n = length(seq)

    stack =
      seq
      |> Enum.with_index()
      |> Enum.reduce([], fn {digit, i}, stack ->
        remaining = n - i

        stack =
          Enum.reduce_while(stack, stack, fn top, acc ->
            cond do
              length(acc) + remaining <= k ->
                #   IO.inspect(
                #     "Devo adicionar todos os numeros que vierem #{inspect(acc)}"
                #   )

                {:halt, acc}

              top < digit ->
                # IO.inspect("removendo #{hd(acc)} pois #{top} < #{digit}")
                {:cont, tl(acc)}

              true ->
                {:halt, acc}
            end
          end)

        # IO.inspect("adicionando  #{digit}")
        [digit | stack]
      end)

    stack
    |> Enum.reverse()
    |> Enum.take(k)
    |> Enum.join("")
  end
end

Part 01

numbers = example
  |> Kino.Input.read()
  |> String.split("\n", trim: true)
  |> Enum.map(fn el -> String.split(el, "", trim: true) end )



numbers
  |> Enum.map(fn seq ->
    seq
    |> Solver.max_subseq_k(2)
    |> String.to_integer()
  end)
  |> Enum.sum()

Part 02

numbers
  |> Enum.map(fn seq ->
    seq
    |> Solver.max_subseq_k(12)
    |> String.to_integer()
  end)
  |> Enum.sum()