Powered by AppSignal & Oban Pro

Day 3: Lobby

2025/day03.livemd

Day 3: Lobby

Mix.install([:kino])

Section

input = Kino.Input.textarea("Input", monospace: true)
max_jolt = fn joltages, capacity ->
  joltages
  |> Enum.split(-capacity)
  |> then(fn {joltages, battery} ->
    Enum.map_reduce(battery, Enum.reverse(joltages), fn b, joltages ->
      Enum.chunk_while(
        joltages,
        {[], b},
        fn
          j, {js, b} when j >= b ->
            {:cont, js ++ [b], {[], j}}

          j, {js, b} ->
            {:cont, {[j | js], b}}
        end,
        fn {_js, b} ->
          {:cont, [b], b}
        end
      )
      |> Enum.flat_map(&Enum.reverse/1)
      |> List.pop_at(-1)
    end)
    |> elem(0)
    |> Integer.undigits()
  end)
end
input
|> Kino.Input.read()
|> String.split()
|> Enum.map(&String.to_integer/1)
|> Enum.map(&Integer.digits/1)
|> Enum.map(&max_jolt.(&1, 2))
|> Enum.sum()
input
|> Kino.Input.read()
|> String.split()
|> Enum.map(&String.to_integer/1)
|> Enum.map(&Integer.digits/1)
|> Enum.map(&max_jolt.(&1, 12))
|> Enum.sum()