一道简单的数学题!
在一个班级中,每个学生都与另外六个学生是朋友,
并且任何两个学生都有两个共同的朋友。
这个班有多少名学生?
技术规格:
该脚本应根据任务条件编译好友词典。
键是学生的姓名,值是学生好友的姓名序列。
班级里没有同名的学生。
一旦满足任务条件,字典的编译就会停止。
该算法不应依赖于班级中预定的学生数量。
输入:
from datetime import datetime
names = {'Лёша', 'Влад', 'Миша', 'Вова', 'Саня', 'Коля',
'Дима', 'Толя', 'Ваня', 'Петя', 'Олег', 'Сеня',
'Лёня', 'Егор', 'Витя', 'Стас', 'Глеб', 'Илья',
'Женя', 'Вика', 'Нина', 'Анна', 'Соня', 'Рита',
'Лика', 'Маша', 'Лиля', 'Роза', 'Таня', 'Надя',
'Алла', 'Даша', 'Кира', 'Лена', 'Тоня', 'Люда',
}
friends = {}
输出:
Каждый ученик дружит ровно c шестью другими,
и у любых двух учеников есть ровно два общих друга?
Результат проверки: True .
Словарь составлен за 0:00:00.004601 ms.
В классе 16 учеников.
^^^^^^^
我的字典是用 编译的4601 ms
,但是数据量这么小,速度很慢。
这是由于对任务条件的遵守情况进行了大量检查。
我将在 2024 年 8 月 9 日晚上发布我的决定作为答案。
测试:
from functools import reduce
def checking(friends) -> bool:
"""Функция проверяет словарь на соответствие условиям задачи.
Тёски среди учеников приведут к неверной оценке.
"""
return (
(
set(friends.keys())
==
reduce(lambda x, y: set(x) | set(y), friends.values())
)
and
(
all((len(v) == 6 for v in friends.values()))
)
and
(
all((all((2 == len(set(val) & set(v))
for v in friends.values()
if v != val)
)
for val in friends.values()
)
)
)
)
print(f'Каждый ученик дружит ровно c шестью другими,\n'
f'и у любых двух учеников есть ровно два общих друга?\n\n'
f'Результат проверки: {checking(friends)} .')
print(f'Словарь составлен за {end - start} ms.\n')
print(f'В классе {len(friends)} учеников.\n\n')
评估解决方案的标准
重量递减:
- 执行时间(因为检查条件是最昂贵的部分)
算法不应依赖于预先已知的学生数量; - 依赖项(使用第三方库应该在步骤1中生效)
目标:
获得替代解决方案,找到最佳技术。
如果有人想成为赞助商,
你可以宣布一场比赛,这是欢迎的。
算法。
形状和颜色。
让我们根据以下标准有条件地划分朋友:朋友四人组。
我们依赖的条件是:“强制拨号”:
“洗牌”
我去年年底就解决了这个问题,我父亲
多次带我回顾这个问题,以便我优化解决方案。
解决方案:
之前已上传至 Google Colab Anna_Friends.ipynb