Вчера я на ощупь подбирал код вот к такому замку от подъезда:
Такой замок относительно легко взломать, нужно просто найти самые отполированные кнопки с мягкими (изношеными) пружинами.
Но если таких кнопок 5? (Например, потому что код уже меняли, и изношенные кнопки сейчас и из предыдущего кода и из настоящего.)
Код с одной кнопкой игнорируем как тривиальный. Код с пятью кнопками тоже, как тривиальный.
#!/usr/bin/env python3 import itertools chars=[3,6,7,9,0] for len in range(2, len(chars)): for comb in itertools.combinations(chars, len): print(comb)
(3, 6) (3, 7) (3, 9) (3, 0) (6, 7) (6, 9) (6, 0) (7, 9) (7, 0) (9, 0) (3, 6, 7) (3, 6, 9) (3, 6, 0) (3, 7, 9) (3, 7, 0) (3, 9, 0) (6, 7, 9) (6, 7, 0) (6, 9, 0) (7, 9, 0) (3, 6, 7, 9) (3, 6, 7, 0) (3, 6, 9, 0) (3, 7, 9, 0) (6, 7, 9, 0)
Кол-во кодов из двух кнопок это \( \binom{5}{2}=10 \) или C(5,2)=10 или 5 choose 2=10 (используется также нотация n choose k).
Кол-во кодов из трех кнопок это \( \binom{5}{3}=10 \) или C(5,3)=10 или 5 choose 3=10 (тоже 10).
Кол-во кодов из четырех кнопок это \( \binom{5}{4}=5 \) или C(5,4)=5.
Сколько вообще кодов возможно, длиной [2,9] (включительно):
#!/usr/bin/env python3 import itertools chars=range(10) for len in range(2, len(chars)): for comb in itertools.combinations(chars, len): print(comb)
C(10,2)+C(10,3)+C(10,4)+C(10,5)+C(10,6)+C(10,7)+C(10,8)+C(10,9)=1012
Но если реалистично, то обычно код или из двух кнопок или из трех:
#!/usr/bin/env python3 import itertools chars=range(10) for len in range(2, 3+1): for comb in itertools.combinations(chars, len): print(comb)
165 возможных вариантов: при должном упорстве можно вручную их все перепробовать.
Попробуйте решить эту задачку без помощи комбинаторики или itertools в Питоне. В лучшем случае, вы придете к чему-то похожему и переизобретете велосипед (что, кстати, оч. полезно для (само)обучения). В худшем случае, ваш код будет слишком громоздким.
Yes, I know about these lousy Disqus ads. Please use adblocker. I would consider to subscribe to 'pro' version of Disqus if the signal/noise ratio in comments would be good enough.