Проблема довольно проста, но очень сложно найти решение, которое не состоит из сотен строк sphagetti else-ifs.
Есть 2 диапазона, которые могут иметь или не иметь границы,если есть границы, они могут быть включительными или нет.
псевдокод:
struct bound
{
float val
bool inclusive
}
struct range
{
optional<bound> lower_bound
optional<bound> upper_bound
}
Например, <3, 5]
(числа> 3 и <= 5) будут <code>range: { lower_bound: {3, false}, upper_bound: {5, true} } и [8,
(числа> = 8) будет range: { lower_bound: { 8, true }, upper_bound: null }
Для двух диапазонов определите отношение первого диапазона ко второму (идентичный, подмножество, супернабор, пересекаются, не пересекаются) (приведенные выше примеры диапазонов не пересекаются, поскольку ни одно из значений не может быть одновременно <= 5 и> = 8)
enum relation { identical, subset, superset, intersect, disjoint }
relation_first_to_second(range first, range second): relation
{
// ???
}
Проблема заключается в том, что при написании функции необходимо соблюдать осторожность для обработки всех возможных угловых случаев.сделал примерную диаграмму, которая демонстрирует эти случаи (-
означает, что границы отсутствуют).Мы можем предположить, что диапазоны всегда действительны сами по себе, другими словами, мы можем предположить, что (если они существуют) A всегда меньше или равно B, а X всегда меньше или равно Y (но мы не можем предполагать связь между: A /ХА / Yb / ВР / У).
lower upper lower upper relation first to second
- - - - identical
- - - Y superset
- - X - superset
- - X Y superset
- B - - subset
- B - Y B=Y: identical, B<Y: subset, B>Y superset
- B X - B<X: disjoint, B>=X: intersect
- B X Y B<X: disjoint, X<=B<=Y: intersect, B>Y: superset
A - - - subset
A - - Y A<=Y: intersect, A>Y: disjoint
A - X - A=X: identical, A<X: superset, A>X: subset
A - X Y A>Y: disjoint, X<=A<=Y: intersect, A<X: superset
A B - - subset
A B - Y Y<A: disjoint, A<=Y<=B: intersect, Y>B: subset
A B X - X<A: subset, A<=X<=B: intersect, X>B: disjoint
A B X Y this will be complex to check...
Обратите внимание, что эта диаграмма не учитывает inclusive
.
Если у вас есть лучшее представление о реализации самих диапазонов - добро пожаловать, просто не надоПредположим, что <=3
совпадает с <4
, и не полагайтесь на тот факт, что несвязанный диапазон может использовать минимальное / максимальное значение целого числа (фактическая проблемная область является более общей).Я не могу придумать лучшего представления, чем тип, состоящий из 2 границ (каждое из которых хранит значение и содержит ли он значение), которые могут существовать или не существовать.
Я ищу код (любой язык или псевдокод) как можно короче, который реализует функцию relation_first_to_second
.Это не гольф-код, но я думаю, что «решение с кратчайшим кодом - лучший ответ» очень важно для этого вопроса.