78 lines
3.2 KiB
Python
78 lines
3.2 KiB
Python
''' ****** Задание 17 из 20 *********
|
||
* Теория шести рукопожатий гласит, что любые два человека на планете могут быть связаны друг с другом через максимум шесть знакомых.
|
||
Но мы не будем идти так далеко — давайте ограничимся двумя уровнями знакомства.
|
||
|
||
Напишите программу, которая по списку пар друзей для каждого человека определяет список его друзей второго уровня — то есть друзей его друзей, исключая его самого и его непосредственных друзей.
|
||
|
||
Формат ввода
|
||
В каждой строке записывается два имени.
|
||
Окончанием ввода служит пустая строка.
|
||
|
||
Формат вывода
|
||
Выведите список всех людей и их «друзей 2-го уровня» в формате «Человек: Друг1, Друг2, ...».
|
||
Список людей и друзей в каждой строке требуется вывести в алфавитном порядке без повторений.
|
||
|
||
|
||
Подсказка
|
||
Сформируйте словарь в котором каждому человеку будет соответствовать множество его друзей.
|
||
|
||
Пройдите по ключам словаря в алфавитном порядке.
|
||
|
||
Для каждого человека сформируйте новое множество как объединение всех множеств друзей друзей.
|
||
|
||
Исключите из полученного множества обрабатываемого человека и список его непосредственных друзей.
|
||
|
||
Пример 1
|
||
Ввод
|
||
|
||
Иванов Петров
|
||
Иванов Сергеев
|
||
Васильев Петров
|
||
Сергеев Яковлев
|
||
Петров Кириллов
|
||
Петров Яковлев
|
||
|
||
Вывод
|
||
|
||
Васильев: Иванов, Кириллов, Яковлев
|
||
Иванов: Васильев, Кириллов, Яковлев
|
||
Кириллов: Васильев, Иванов, Яковлев
|
||
Петров: Сергеев
|
||
Сергеев: Петров
|
||
Яковлев: Васильев, Иванов, Кириллов
|
||
'''
|
||
|
||
|
||
if __name__ == "__main__":
|
||
friends = {}
|
||
while x := input().split():
|
||
if x[0] not in friends:
|
||
friends[x[0]] = {x[1]}
|
||
else:
|
||
friends[x[0]].add(x[1])
|
||
if x[1] not in friends:
|
||
friends[x[1]] = {x[0]}
|
||
else:
|
||
friends[x[1]].add(x[0])
|
||
|
||
friends_2 = dict.fromkeys(friends, set())
|
||
for friend in friends:
|
||
for n in friends[friend]:
|
||
friends_2[friend] = friends_2[friend].union(friends[n])
|
||
friends_2[friend].discard(friend)
|
||
for z in friends[friend]:
|
||
friends_2[friend].discard(z)
|
||
|
||
data = []
|
||
for friend in friends_2:
|
||
data.append(f'{friend}: {", ".join(sorted(friends_2[friend]))}')
|
||
data.sort()
|
||
for string in data:
|
||
print(string)
|
||
|
||
|
||
|
||
|
||
|
||
|