Erlang Dominator
-module(dominator).
-export([dominator/1]).
dominator(A) ->
Indexed = lists:zip(lists:seq(0, length(A) - 1), A),
{FinalSize, FinalValue, FinalIndex} = lists:foldl(fun({K, V}, {Size, Value, Index}) ->
case Size of
0 -> {1, V, K};
_ ->
case Value =:= V of
true -> {Size + 1, Value, Index};
false -> {Size - 1, Value, Index}
end
end
end, {0, undefined, 0}, Indexed),
Candidate = case FinalSize > 0 of
true -> FinalValue;
false -> -1
end,
Count = length([X || X <- A, X =:= Candidate]),
case Count > length(A) / 2 of
true -> FinalIndex;
false -> -1
end.
This finds a value that appears in more than half of the array, then returns one valid index for it.