Пересечения диапазонов

312 просмотра
0
0 Комментариев

Всем привет! Подскажите пожалуйста, как в Python по уму сделать нахождения пересекаются ли диапазоны. Например, человек ищет людей в возрасте «от 9 до 14» и «от 15 до 21», при этом сам указывает, что ему «от 18 до 21». Второй человек же указывает что ему «от 8 до 11» и ищет при этом «от 21 до 40». Необходимо, чтобы все были довольны. То есть, во-первых искомый человек должен соответствовать искомым промежуткам возраста, во-вторых если тот кто ищет не удовлетворяет параметрам поиска искомого — то поиск должен вернуть false.
Наглядно такие массивы:

"search_users"{
"user_1" => {
    "my_age_from" => "18",
    "my_age_to" => "21",
    "wish_user_ages" => {
        {"from"=>"9", "to"=>"14"},
        {"from"=>"15", "to"=>"21"}
    }
},
"user_2" => {
    "my_age_from" => "8",
    "my_age_to" => "11",
    "wish_user_ages" => {
        {"from"=>"21", "to"=>"40"}
    }
},
 
....

Как найти только пересекающихся пользователей. Чтобы они друг другу были угодны. Есть вариант циклом проходить все условия, но это слишком трудно и как-то трудно укладывается в голове, был бы ещё возраст свой не диапозоном — не было бы проблем. И мне кажется есть какой-нибудь вообще более простой метод нежели циклы с условиями. Пожалуйста, помогите, гуру!))


Добавить комментарий

1 Ответы

Python Опубликовано 09.12.2018
0

Ну раз начали минусовать и править всякие формальности типа почему ты использовал слово «массив». Написал алгоритм сам, и надеюсь кто-то найдётся, кто сможет его улучшить 🙂

def isComplyUsers(user1, user2, exchange=true):
for wish_age in user1.wish_user_ages:
    # user2 не удовлетворяет желаниям user1
    if(user2.my_age_from > wish_age.to or (user2.my_age_from < wish_age.from and user2.my_age_to < wish_age.to)):
        continue
    else:
        if exchange:
            # Меняем местами и чтобы всё это не зациклилось говорим, что местами менять больше не требуется
            return isComplyUsers(user2, user1, false)
        else:
            return true
        break;
 
return false

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up