Elixir Ladder
defmodule Ladder do
import Bitwise
def ladder(a, b) do
mod = (1 <<< Enum.max(b)) - 1
limit = Enum.max(a)
fib = build_fib(limit, mod)
a
|> Enum.zip(b)
|> Enum.map(fn {ai, bi} -> Map.get(fib, ai + 1) &&& (1 <<< bi) - 1 end)
end
defp build_fib(limit, mod) do
Enum.reduce(2..(limit + 1)//1, %{0 => 0, 1 => 1}, fn i, fib ->
value = (Map.get(fib, i - 1) + Map.get(fib, i - 2)) &&& mod
Map.put(fib, i, value)
end)
end
end
This precomputes climb counts once and applies the modulo per query, which avoids recalculating the same paths over and over.