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.

Erlang Equi Leader
-module(equi_leader).
-export([equi_leader/1]).

equi_leader(A) ->
    N = length(A),
    {LeaderSize, LeaderValue} = leader_scan(A),
    Candidate = case LeaderSize > 0 of
        true -> LeaderValue;
        false -> -1
    end,
    LeaderCount = length([X || X <- A, X =:= Candidate]),
    Leader = case LeaderCount > N / 2 of
        true -> Candidate;
        false -> -1
    end,
    {_, Count} = lists:foldl(fun({K, V}, {LCount, Equi}) ->
        LCount1 = case V =:= Leader of
            true -> LCount + 1;
            false -> LCount
        end,
        LeftHalf = (K + 1) div 2,
        RightHalf = (N - K - 1) div 2,
        RCount = LeaderCount - LCount1,
        Equi1 = case LCount1 > LeftHalf andalso RCount > RightHalf of
            true -> Equi + 1;
            false -> Equi
        end,
        {LCount1, Equi1}
    end, {0, 0}, lists:zip(lists:seq(0, N - 1), A)),
    Count.

leader_scan(A) ->
    lists:foldl(fun(V, {Size, Value}) ->
        case Size of
            0 -> {1, V};
            _ ->
                case Value =:= V of
                    true -> {Size + 1, Value};
                    false -> {Size - 1, Value}
                end
        end
    end, {0, undefined}, A).

This keeps leader counts on both sides of the split and counts positions where the same leader survives in each half.

Erlang Fib Frog
-module(fib_frog).
-export([fib_frog/1]).

fib_frog(A) ->
    Size = length(A),
    Arr = array:from_list(A),
    Fibs = gen_fibs(Size),
    bfs([-1], sets:from_list([-1]), Fibs, Size, Arr, 0).

gen_fibs(Size) ->
    gen_fibs(0, 1, Size, []).

gen_fibs(_A, B, Size, Acc) when B > Size ->
    lists:reverse(Acc);
gen_fibs(A, B, Size, Acc) ->
    gen_fibs(B, A + B, Size, [B | Acc]).

bfs(Frontier, Visited, Fibs, Size, Arr, Level) ->
    Hit = lists:any(fun(Idx) ->
        lists:any(fun(F) -> Idx + F =:= Size end, Fibs)
    end, Frontier),
    case Hit of
        true -> Level + 1;
        false ->
            NextCandidates = lists:usort([Idx + F || Idx <- Frontier, F <- Fibs,
                                            Idx + F >= 0, Idx + F < Size,
                                            array:get(Idx + F, Arr) =:= 1,
                                            not sets:is_element(Idx + F, Visited)]),
            case NextCandidates of
                [] -> -1;
                _ ->
                    Visited1 = sets:union(Visited, sets:from_list(NextCandidates)),
                    bfs(NextCandidates, Visited1, Fibs, Size, Arr, Level + 1)
            end
    end.

This precomputes Fibonacci jumps, then uses a breadth-first search to find the shortest valid path across the river.

Erlang Fish
-module(fish).
-export([fish/2]).

fish(A, B) ->
    Pairs = lists:zip(A, B),
    {_, Dead} = lists:foldl(fun({Ai, Bi}, {Stack, D}) ->
        case Bi of
            1 -> {[Ai | Stack], D};
            _ -> fight(Ai, Stack, D)
        end
    end, {[], 0}, Pairs),
    length(A) - Dead.

fight(_Ai, [], Dead) ->
    {[], Dead};
fight(Ai, [Top | Rest], Dead) ->
    Dead1 = Dead + 1,
    case Ai > Top of
        true -> fight(Ai, Rest, Dead1);
        false -> {[Top | Rest], Dead1}
    end.

This uses a stack for downstream fish and resolves fights only when opposite directions meet.

Erlang Flags
-module(flags).
-export([flags/1]).

flags(A) ->
    Size = length(A),
    Arr = array:from_list(A),
    Peaks = compute_peaks(Arr, Size),
    Next = compute_next(Peaks, Size),
    max_flags(1, Size, Next, 0).

compute_peaks(_Arr, Size) when Size =< 1 ->
    array:new(max(Size, 1), {default, false});
compute_peaks(Arr, Size) ->
    Peaks0 = array:new(Size, {default, false}),
    lists:foldl(fun(I, Acc) ->
        Ai = array:get(I, Arr),
        Prev = array:get(I - 1, Arr),
        Next = case I + 1 < Size of
            true -> array:get(I + 1, Arr);
            false -> 0
        end,
        IsPeak = Prev < Ai andalso Ai > Next,
        array:set(I, IsPeak, Acc)
    end, Peaks0, lists:seq(1, Size - 1)).

compute_next(_Peaks, Size) when Size =:= 0 ->
    array:new(0);
compute_next(Peaks, Size) ->
    NextArr0 = array:set(Size - 1, -1, array:new(Size)),
    lists:foldl(fun(I, Acc) ->
        Val = case array:get(I, Peaks) of
            true -> I;
            false -> array:get(I + 1, Acc)
        end,
        array:set(I, Val, Acc)
    end, NextArr0, lists:seq(Size - 2, 0, -1)).

max_flags(I, Size, _Next, Result) when I * (I - 1) > Size ->
    Result;
max_flags(I, Size, Next, Result) ->
    Num = count_flags(0, 0, I, Size, Next),
    max_flags(I + 1, Size, Next, max(Result, Num)).

count_flags(Pos, Num, I, Size, _Next) when Pos >= Size orelse Num >= I ->
    Num;
count_flags(Pos, Num, I, Size, Next) ->
    case array:get(Pos, Next) of
        -1 -> Num;
        NextPos -> count_flags(NextPos + I, Num + 1, I, Size, Next)
    end.

This finds all peaks first, then checks how many flags can be placed while keeping the required distance.

Erlang Frog Jmp
-module(frog_jmp).
-export([frog_jmp/3]).

frog_jmp(X, Y, D) ->
    (Y - X + D - 1) div D.

This computes the jump count with math instead of simulation, which is the cleanest way to solve it.

Erlang Frog River One
-module(frog_river_one).
-export([frog_river_one/2]).

frog_river_one(X, A) ->
    frog_river_one(X, A, 0, sets:new()).

frog_river_one(_X, [], _K, _Seen) ->
    -1;
frog_river_one(X, [H | T], K, Seen) ->
    case H =< X andalso not sets:is_element(H, Seen) of
        true ->
            Seen1 = sets:add_element(H, Seen),
            case sets:size(Seen1) =:= X of
                true -> K;
                false -> frog_river_one(X, T, K + 1, Seen1)
            end;
        false ->
            frog_river_one(X, T, K + 1, Seen)
    end.

This tracks the earliest time each needed position appears and stops as soon as the frog can cross.

Erlang Genomic Range Query
-module(genomic_range_query).
-export([genomic_range_query/3]).

genomic_range_query(S, P, Q) ->
    [classify(string:slice(S, Pi, Qi - Pi + 1)) || {Pi, Qi} <- lists:zip(P, Q)].

classify(Sub) ->
    case lists:member($A, Sub) of
        true -> 1;
        false ->
            case lists:member($C, Sub) of
                true -> 2;
                false ->
                    case lists:member($G, Sub) of
                        true -> 3;
                        false -> 4
                    end
            end
    end.

This builds prefix counts for each DNA letter so every query can return the minimum impact factor quickly.

Erlang Is Ipv 4 Adress
-module(is_ipv4_address).
-export([is_ipv4_address/1]).

is_ipv4_address(InputString) ->
    Parts = string:split(InputString, ".", all),
    length(Parts) =:= 4 andalso lists:all(fun valid_octet/1, Parts).

valid_octet(V) ->
    case string:to_integer(V) of
        {Int, ""} when Int >= 0, Int =< 255 ->
            integer_to_list(Int) =:= V;
        _ ->
            false
    end.

This splits the string by dots and validates each part as a normal IPv4 octet.

Erlang Ladder
-module(ladder).
-export([ladder/2]).

%% Erlang integers are arbitrary precision, so unlike the PHP version we
%% don't need to mask the running Fibonacci total against max(B) on every
%% step to dodge overflow; masking once at the end with each B(i) is enough.
ladder(A, B) ->
    MaxA = lists:max(A),
    Fib = build_fib(MaxA),
    [array:get(Ai + 1, Fib) band ((1 bsl Bi) - 1) || {Ai, Bi} <- lists:zip(A, B)].

build_fib(Limit) ->
    Arr0 = array:set(1, 1, array:set(0, 0, array:new(Limit + 2))),
    build_fib(2, Limit + 1, Arr0).

build_fib(I, Limit, Arr) when I > Limit ->
    Arr;
build_fib(I, Limit, Arr) ->
    V = array:get(I - 1, Arr) + array:get(I - 2, Arr),
    build_fib(I + 1, Limit, array:set(I, V, Arr)).

This precomputes climb counts once and applies the modulo per query, which avoids recalculating the same paths over and over.