Этот вопрос оказался более интересным, чем я ожидал. Для меня оригинальное решение выглядело слишком сложным. Я не доверяю сложным, поэтому я попробовал свои силы в решении, которое было проще и легко доказуемо правильным. Я должен был оставить сравнение менее или равно, а не меньше. После игры, чтобы сравнить скорости двух, я случайно, на испытании только двух условий, обнаружил, что исходное решение было ошибочным. Я также узнал, что хотя мое решение - с упомянутой коррекцией - было медленнее предлагаемого решения.
Предлагаемое решение не позволяет выполнить 5 из 24 возможных случаев. Я оставляю это автору для исправления его функции. Я даже не пытался определить, где произошла его ошибка. Но я предлагаю следующую функцию, которая будет использоваться для тестирования.
Есть инструменты для покрытия кода тестирования. Эта проблема и решения интересны тем, что покрытие для полного тестирования решения должно быть меньше линейного уровня в детализации.
В следующем коде передайте предлагаемую функцию test_intersection. Это вызовет исключение, если даже один из 24 возможных случаев не удастся. Мое решение, и модификация, предложенная с использованием кортежа внутри, проходит все 24. Исходное решение выходит из строя 5 случаев. После публикации этого, я понимаю, что есть некоторые дополнительные случаи, которые можно добавить. ([3,4], [3,7]), ([3,7], [3,7]), ([4,7], [3,7]), а также варианты, интервалы "линий назад.
def test_intersection (f):
assert not f ([1,2], [3,7])
assert f ([1,3], [3,7])
assert f ([1,4], [3,7])
assert f ([4,5], [3,7])
assert f ([4,8], [3,7])
assert f ([7,9], [3,7])
assert not f ([8,9], [3,7])
assert not f ([2,1], [3,7])
assert f ([3,1], [3,7])
assert f ([4,1], [3,7])
assert f ([5,4], [3,7])
assert f ([8,4], [3,7])
assert f ([9,7], [3,7])
assert not f ([9,8], [3,7])
assert not f ([1,2], [7,3])
assert f ([1,3], [7,3])
assert f ([1,4], [7,3])
assert f ([4,5], [7,3])
assert f ([4,8], [7,3])
assert f ([7,9], [7,3])
assert not f ([8,9], [7,3])
assert not f ([2,1], [7,3])
assert f ([3,1], [7,3])
assert f ([4,1], [7,3])
assert f ([5,4], [7,3])
assert f ([9,7], [7,3])
assert not f ([9,8], [7,3])
Попробуйте вместо этого разместите свой вопрос на [codereview.SE]. – Mast
Вероятно, вам стоит опубликовать обзор кода, как предположил @Mast. Вы также можете посмотреть, как это делает Sympy: http://docs.sympy.org/0.7.0/modules/geometry.html –
. Второе функционирование может быть упрощено для 'return set (range (a [0], a [ 1] +1)). Пересечение (диапазон (b [0], b [1])) ' –