Powered by AppSignal & Oban Pro

Advent of code 2025 day 2

aoc2025day3.livemd

Advent of code 2025 day 2

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

Part 1

https://adventofcode.com/2025/day/3

input = Kino.Input.textarea("Please give me input:")
list_of_banks =
  Kino.Input.read(input)
  |> String.split("\n", trim: true)
  |> Enum.map(fn str -> String.to_charlist(str) |> Enum.map(& &1 - ?0) end)

length(list_of_banks)
defmodule Part1 do
  def highest_joltage(bank) when is_list(bank) do
    digits =
      Enum.chunk_every(bank, 2, 1, :discard)
      |> Enum.reduce(
        [0, 0],
        fn [val1, val2], acc ->
          [highest, afterHighest] = acc
          cond do
            val1 > highest -> [val1, val2]
            val2 > afterHighest -> [highest, val2]
            true -> acc
          end
        end
      )

    Integer.undigits(digits)
  end

  def total_output_jotage(list_of_banks) do
    Enum.map(list_of_banks, &highest_joltage/1) |> Enum.sum()
  end
end

Part1.total_output_jotage(list_of_banks)

Part 2

defmodule Part2 do
  def highest_joltage(bank) when is_list(bank) do
    digits =
      Enum.chunk_every(bank, 12, 1, :discard)
      |> Enum.reduce(
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        fn [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12], acc ->
          [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11, h12] = acc

          cond do
            v1 > h1 ->   [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12]
            v2 > h2 ->   [h1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12]
            v3 > h3 ->   [h1, h2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12]
            v4 > h4 ->   [h1, h2, h3, v4, v5, v6, v7, v8, v9, v10, v11, v12]
            v5 > h5 ->   [h1, h2, h3, h4, v5, v6, v7, v8, v9, v10, v11, v12]
            v6 > h6 ->   [h1, h2, h3, h4, h5, v6, v7, v8, v9, v10, v11, v12]
            v7 > h7 ->   [h1, h2, h3, h4, h5, h6, v7, v8, v9, v10, v11, v12]
            v8 > h8 ->   [h1, h2, h3, h4, h5, h6, h7, v8, v9, v10, v11, v12]
            v9 > h9 ->   [h1, h2, h3, h4, h5, h6, h7, h8, v9, v10, v11, v12]
            v10 > h10 -> [h1, h2, h3, h4, h5, h6, h7, h8, h9, v10, v11, v12]
            v11 > h11 -> [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, v11, v12]
            v12 > h12 -> [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11, v12]
            true -> acc
          end
        end
      )

    Integer.undigits(digits)
  end

  def total_output_jotage(list_of_banks) do
    Enum.map(list_of_banks, &highest_joltage/1) |> Enum.sum()
  end
end

Part2.total_output_jotage(list_of_banks)