You're saving a few characters to make the code less obvious. Please correct me if there's some other benefit.
If two appointments conflict, that means that there is a time when they are both active. Thus each of their end times are after both of their start times. Of course, each appointment ends after it started, so that just leaves that each appointment ends after the other started. So if the appointments are a to b and c to d, then they conflict iff b > c and d > a.
(I've corrected bumbledraven's mistake of a > d vs. d > a.)
a = 1, b = 3, c = 2, d = 4.
Do they conflict?
b > c and a > d
with conflicting appointments from 1-3 and 2-4:
a = 1, b = 3, c = 2, d = 4
won't that evaluate to:
3 > 2 and 1 > 4
true and false
false (no conflict)
I could be wrong, but I think you have to do all four comparisons as in aldarn's comment:
https://news.ycombinator.com/item?id=14641043
(no fair peeking!)
With two events, X going from xb to xe, and Y going from yb to ye, you have these possible sequences:
xb xe yb ye (no conflict)
xb yb xe ye (conflict)
xb yb ye xe (conflict)
yb ye xb xe (no conflict)
yb xb ye xe (conflict)
yb xb xe ye (conflict)
As long as (xb >= ye or yb >= xe) there's no conflict. You can flip those: (xb < ye and yb < xe) to get the conflict condition.We can evaluate this expression over those cases:
xb xe yb ye : yb < xe => false => no conflict
xb yb xe ye : xb < ye and yb < xe => true, conflict
xb yb ye xe : xb < ye and yb < xe => true, conflict
yb ye xb xe : xb < ye => false => no conflict
yb xb ye xe : xb < ye and yb < xe => true, conflict
yb xb xe ye : xb < ye and yb < xe => true, conflict
So you only need two comparisons, and an and operation.Just to compare with the previous comments, if we put your notation back into the a-b c-d format, then it would be:
conflict = c < b and a < d
It's interesting to note how the choice of names makes such a difference. With the arbitrary names a, b, c, d for the four times, it's harder to think about whether the expression is right. Which was 'c' again?
Your names xb, xe, yb, ye are still terse, but once you know that x means one appointment and y means the other, and be and e mean beginning and end, it makes it much easier to think about it.
which I first understood to be a conversational statement rather than a statement of logic (which I assume GP is referring to), in which case it should be (b > c or a > d).
Say the first appointment goes from a to b and the second goes from c to d. What does it look like if the appointments _don't_ conflict? This happens just when one appointment ends no later than the other begins; in other words, when b ≤ c or d ≤ a. So, the appointments conflict just when not(b ≤ c or d ≤ a). We can then distribute the negation using [De Morgan's laws](https://en.wikipedia.org/wiki/Negation#Distributivity) to arrive at this: the appointments conflict just when b > c and a > d.