Do the ranges overlap?

Given two ranges:

R 1 = { n | b 1 n < b 1 + s 1 }

R 2 = { n | b 2 n < b 2 + s 2 }

determine whether they overlap.

The ranges are specified using two values: an inclusive beginning b and a size s.

Solution

  1. If ( b 1 , s 1 ) > ( b 2 , s 2 ) , swap the ranges.
  2. The ranges overlap iff b 1 + s 1 > b 2 .

Notes

Tuple comparison is defined canonically (first differing element decides):

( b 1 , s 1 ) > ( b 2 , s 2 ) iff ( b 1 > b 2 ) ( b 1 = b 2 s 1 > s 2 )

Proof

There is an exhaustive list of cases how two ranges may overlap:

0 1 2 3 4 5 6 7 8 9 name blue orange first second left comparison value right comparison value comparison result overlap observed comparison matches observation
beginning size beginning size beginning size beginning size
(base range)
after 3 4 0 2 0 2 3 4 2 3
start touching 3 4 0 3 0 3 3 4 3 3
start inside 3 4 0 4 0 4 3 4 4 3
inside start touching 3 4 3 7 3 4 3 7 7 3
enclosing start touching 3 4 3 3 3 3 3 4 6 3
enclosing 3 4 4 2 3 4 4 2 7 4
enclosing end touching 3 4 4 3 3 4 4 3 7 4
exact match 3 4 3 4 3 4 3 4 7 3
inside 3 4 0 10 0 10 3 4 10 3
inside end touching 3 4 0 7 0 7 3 4 7 3
end inside 3 4 6 4 3 4 6 4 7 6
end touching 3 4 7 3 3 4 7 3 7 7
before 3 4 8 2 3 4 8 2 7 8