You could group values by their indexes and for each grouped values, recursively iterate with a look ahead pointer on a list that has at least two elements comparing if the indexes abs diff is <= k, if you do all of this lazily and then try to take at least 1 and if it’s not an empty list then you’ve found one pair of indexes.
I think something like this would do it:
defmodule Solution do
defp has_index_diff_le?(values, k) do
case values do
[index1, index2 | rest] ->
case abs(index2 - index1) <= k do
true -> true
false -> has_index_diff_le?([index2 | rest], k)
end
_ ->
false
end
end
def contains_dup?(values, k) do
result =
values
|> Stream.with_index()
|> Enum.group_by(fn x -> elem(x, 0) end, fn x -> elem(x, 1) end)
|> Map.values()
|> Stream.filter(&match?([_head | _tail], &1))
|> Stream.map(fn vals -> has_index_diff_le?(vals, k) end)
|> Stream.drop_while(&(&1 == false))
|> Stream.take(1)
|> Enum.to_list()
case result do
[] -> false
[_] -> true
end
end
end
false = [1, 2, 3, 4, 2] |> Solution.contains_dup?(1)
false = [1, 2, 3, 4, 2] |> Solution.contains_dup?(2)
true = [1, 2, 3, 4, 2] |> Solution.contains_dup?(3)
false = [1, 2, 3, 4] |> Solution.contains_dup?(4)
true = [1, 0, 1, 1] |> Solution.contains_dup?(1)






















