Elixir Array Change
defmodule ArrayChange do
def array_change(a) when length(a) < 2, do: 0
def array_change(a) do
{_final, total} =
Enum.reduce(0..(length(a) - 2), {a, 0}, fn k, {arr, total} ->
cur = Enum.at(arr, k)
nxt = Enum.at(arr, k + 1)
if cur >= nxt do
diff = cur - nxt + 1
{List.update_at(arr, k + 1, &(&1 + diff)), total + diff}
else
{arr, total}
end
end)
total
end
end
This moves left to right and bumps values only when needed so the array becomes strictly increasing.