Как сделать задачу?

Напишите функцию interval_intersect(a, b, c, d), которая принимает четыре параметра и возвращает True, если отрезки [a, b] и [c, d] пересекаются, и False иначе. Вы можете предполагать, что a <= b, c <= d

Замечание: вернуть необходимо логические константы True или False, а не строки "True" или "False"

Sample Input: 1 10 5 9

Sample Output: True

def interval_intersect(a, b, c, d):
    xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
    ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) 

    def interval_intersect(a, b, c, d):
        return a[0] * b[1] - a[1] * b[0]

    div = det(xdiff, ydiff)
    if div == 0:
       raise Exception('lines do not intersect')

    d = (det(*line1), det(*line2))
    x = det(d, xdiff) / div
    y = det(d, ydiff) / div
    return x, y

print(line_intersection((A, B), (C, D)))

Ответы (4 шт):

Автор решения: Gladius
def interval_intersect(a, b, c, d):
    return bool(set(range(a, b + 1)) & set(range(c, d + 1)))

Объяснение:

set(range(a, b + 1)) и set(range(c, d + 1)) создают множества с элементами от a до b и от c до d включительно.

(То есть для входных данных 1, 3, 2, 4 это будет {1, 2, 3} и {2, 3, 4})

В range ко второму аргументу прибавляем единицу, так как в range не входит значение второго аргумента, а только число перед ним.

Оператор & возвращает пересечение множеств, то есть элементы, находящиеся в обоих множествах одновременно.

Так как нам надо, чтобы функция возвращала True или False, то добавляем bool().

Данная функция вернет True во всех случаях, когда пересечением не является пустое множество - что нам и надо.

→ Ссылка
Автор решения: Danis
def foo(a, b, c, d):
    pos0, pos1 = [a, b], [c, d]
    pos0.sort()
    pos1.sort()
    n0 = ((pos0[0] < pos1[0] < pos0[1] or pos0[0] < pos1[1] < pos0[1]))
    n1 = ((pos1[0] < pos0[0] < pos1[1] or pos1[0] < pos0[1] < pos1[1]))
    return n0 or n1
→ Ссылка
Автор решения: imitusov
def interval_intersect(a, b, c, d):
    return (a <= c <= b <= d) | (c <= a <= d <= b) | (a <= c <= d <= b) | (c <= a <= b <= d)
→ Ссылка
Автор решения: splash58

поскольку Вы можете предполагать, что a <= b, c <= d достаточно сравнить максимум левых концов отрезков с минимумом правых

def interval_intersect(a, b, c, d):
    return max(a,c) < min(b,d)
→ Ссылка