def overlap?(r1,r2)
!(r1.first > r2.last || r1.last < r2.first)
end
overlap? 1..5, 4..10 #=> true
overlap? 1..5, 6..10 #=> false
overlap? 1..10, 4..8 #=> true
overlap? 1..4, 4..8 #=> true
The operative line is equivalent to:
r1.first <= r2.last && r1.last >= r2.first
I normally try to avoid negation, but in this case I think it reads better with it.
Another way:
def overlap?(r1,r2)
!(([r1.first, r2.first].min..[r1.last, r2.last].max).size >= r1.size + r2.size)
end
overlap? 1..5, 4..10 #=> true
overlap? 1..5, 6..10 #=> false
overlap? 1..10, 4..8 #=> true
overlap? 1..4, 4..8 #=> true
The operative line is equivalent to:
([r1.first, r2.first].min..[r1.last, r2.last].max).size < r1.size + r2.size
Again, I prefer the one with negation.