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.