Count cars passing in opposite directions
def solution(a)
  results = 0
  east_count = 0
  a.each do |el|
    if el == 0
      east_count += 1
    else
      results += east_count
    end
    return -1 if results &gt; 1000000000
  end
  results
end


Note that you don't have to compare each car to every other car.  You just have to track how many are traveling east and each time you find someone going west, increment your results by the eastbound count.  I find this easier to understand than tracking the westbound cars backwards.  

r | c
--+--
0 | 0
0 | 1
1 | 1 (0,1)
1 | 2
3 | 2 (0,3), (2,3)
5 | 2 (0,4), (2,4)


In the table, r stands for results and c stands for east_count.  The pairs found at any point are to the right.  

This will not find the pairs that pass, but it does count them.  It maintains the required \$P &lt; Q\$ by order of iteration.  

I don't know much about Ruby, so I won't try to make syntactic comments.  Apologies if my own syntax is weak.  

This iterates through the array once, so it's \$O(n)\$ in time.  It defines a constant number of scalar variables, so it's \$O(1)\$ memory beyond the input array.