Задача на пересечение отрезков, помогите закончить альтернативно (python)
Пересечение отрезков
На числовой прямой даны два отрезка: a1, b1, a2, b2. Напишите программу, которая находит их пересечение. Пересечением двух отрезков может быть: отрезок; точка; пустое множество. Гарантируется, что a1 < b1, a2 < b2.
Формат выходных данных Программа должна вывести на экран границы отрезка, являющегося пересечением, либо общую точку, либо текст «пустое множество».
Sample Input 1:
1
3
2
4
Sample Output 1:
2 3
Sample Input 2:
1
2
3
4
Sample Output 2:
пустое множество
Sample Input 3:
5
6
6
8
Sample Output 3:
6
Я понимаю, как это сделать через высчитывания бесконечных возможных пересечений Однако, мне хочется решить так:
a1 = int(input())
b1 = int(input())
a2 = int(input())
b2 = int(input())
line1=range(a1, b1+1)
line2=range(a2, b2+1)
l1=[]
l2=[]
for i in line1:
l1.append(i)
for i in line2:
l2.append(i)
for i in line1:
for b in line2:
if b == i == a1:
print(b, end=' ')
if b == i == b1:
print(b, end=' ')
if b == i == a2:
print(b, end=' ')
if b == i == b2:
print(b, end=' ')
Но хоть убейте не могу вписать вариант:
пустое множество
Как в Python посчитать длину прежнего вывода - если он пустой (а через len показывает 4 символа, даже когда там вроде как ничего нету) чтобы задать условия вывода "пустого множества"
Ответы (3 шт):
Я понял, что вопрос в другом, но во избежание споров о том, что можно решить проще, накидал простой пример на C#
void PrintIntersection(int a1, int b1, int a2, int b2)
{
// координаты должны быть упорядочены
if (a1 > b1) (a1, b1) = (b1, a1);
if (a2 > b2) (a2, b2) = (b2, a2);
// первым будет отрезок с наименьшей первой координатой
if (a1 > a2) (a1, b1, a2, b2) = (a2, b2, a1, b1);
if (b1 < a2) {
Console.WriteLine("Пустое множество");
return;
}
if (b1 == a2)
{
Console.WriteLine(b1);
return;
}
Console.WriteLine($"{a2} {b1}");
}
Проверка
PrintIntersection(1, 3, 2, 4);
PrintIntersection(1, 2, 3, 4);
PrintIntersection(5, 6, 6, 8);
PrintIntersection(6, 8, 5, 6);
PrintIntersection(1, 2, 1, 2);
Вывод
2 3
Пустое множество
6
6
1 2
a1 = int(input())
b1 = int(input())
a2 = int(input())
b2 = int(input())
line1=range(a1, b1+1)
line2=range(a2, b2+1)
l1=[]
l2=[]
resoult=[]
for i in line1:
l1.append(i)
for i in line2:
l2.append(i)
for i in line1:
for b in line2:
if b == i == a1:
resoult.append(b)
if b == i == b1:
resoult.append(b)
if b == i == a2:
resoult.append(b)
if b == i == b2:
resoult.append(b)
for i in set(resoult): # сет убрал повторы
print(i, end=' ')
if resoult == []:
print('пустое множество') # список пустой - значит совпадений нет
# процедура сравнения отрезков
def compare_segments(line_1, line_2):
# согласно алгоритму поиска нам надо сделать следующее:
# сначала сравнить первые координаты отрезков и найти максимальное значение
first_pair=max(line_1[0], line_2[0])
# далее нам надо сравнить вторые координаты отрезков и найти минимальное
second_pair=min(line_1[1], line_2[1])
# теперь выполняем сравнение полученных величин
# если первая пара меньше второй
if first_pair < second_pair:
# то наш результат следующий
return(first_pair, second_pair)
# если пары равны, то у нас пересечение это просто точка
elif first_pair==second_pair:
return("результат - точка; %s" % first_pair)
# а если пара "большего" больше пары "меньшего", то
else:
return "пустое множество"
#точка входа в модуль
if __name__=="__main__":
#цикл для "бесконечной работы"
while (True):
line_1=[0, 0]
line_2=[0, 0]
# comment: просим пользователя ввести какую-нибудь строку
text=input("Please enter first line (two digits with a space): ")
#передаём полученную строку в метод
# print_input_string(text)
if text==" " or text=='':
break
elif len(text.split(" ")) == 2:
line_1[0]=text.split(" ")[0]
line_1[1]=text.split(" ")[1]
text=input("Please enter second line (two digits with a space): ")
if text==" " or text=='':
break
elif len(text.split(" ")) == 2:
line_2[0]=text.split(" ")[0]
line_2[1]=text.split(" ")[1]
print(compare_segments(line_1, line_2))
# end while