Advent of Code 2025 - Day 11

The quickest day for me until now, which is surprising for day 11/12:

defmodule Y2025.D11 do
  use Day, input: "2025/11", part1: ~c"l", part2: ~c"l"

  defp part1(input) do
    input
    |> parse_input()
    |> count("you", "out")
  end

  defp part2(input) do
    map = parse_input(input)

    dac_fft = count(map, "svr", "dac") * count(map, "dac", "fft") * count(map, "fft", "out")
    fft_dac = count(map, "svr", "fft") * count(map, "fft", "dac") * count(map, "dac", "out")

    dac_fft + fft_dac
  end

  defp count(_, to, to), do: 1

  defp count(map, from, to) do
    Performance.memoize({from, to}, fn ->
      map
      |> Map.get(from, [])
      |> Enum.map(&count(map, &1, to))
      |> Enum.sum()
    end)
  end

  defp parse_input(input) do
    input
    |> Enum.map(&parse_line/1)
    |> Map.new()
  end

  defp parse_line(<<from::bytes-size(3), ": ", to::binary>>), do: {from, Utils.splitrim(to, " ")}
end

Pretty similar to the solutions above, except that I use my Performance.memoize helper instead of the usual cache/memo Map. I takes ~5ms to run on my machine for part 2.