Go Fish
func fish(a, b []int) int {
size := len(a)
dead := 0
downstream := make([]int, 0, size)
for i := 0; i < size; i++ {
if b[i] == 1 {
downstream = append(downstream, a[i])
} else {
for len(downstream) > 0 {
dead++
if a[i] > downstream[len(downstream)-1] {
downstream = downstream[:len(downstream)-1]
} else {
break
}
}
}
}
return size - dead
}
This uses a stack for downstream fish and resolves fights only when opposite directions meet.