Elixir Frog River One
defmodule FrogRiverOne do
def frog_river_one(x, a) do
a
|> Enum.with_index()
|> Enum.reduce_while(MapSet.new(), fn {leaf, k}, seen ->
seen =
if leaf <= x and not MapSet.member?(seen, leaf) do
MapSet.put(seen, leaf)
else
seen
end
if MapSet.size(seen) == x, do: {:halt, k}, else: {:cont, seen}
end)
|> case do
k when is_integer(k) -> k
_ -> -1
end
end
end
This tracks the earliest time each needed position appears and stops as soon as the frog can cross.