Elixir Fish
defmodule Fish do
def fish(a, b) do
size = length(a)
{_stack, dead} =
a
|> Enum.zip(b)
|> Enum.reduce({[], 0}, fn {size_i, dir_i}, {stack, dead} ->
if dir_i == 1 do
{[size_i | stack], dead}
else
fight(size_i, stack, dead)
end
end)
size - dead
end
defp fight(_size_i, [], dead), do: {[], dead}
defp fight(size_i, [top | rest] = stack, dead) do
if size_i > top do
fight(size_i, rest, dead + 1)
else
{stack, dead + 1}
end
end
end
This uses a stack for downstream fish and resolves fights only when opposite directions meet.