[Math] Взлом кодового замка подъезда при помощи комбинаторики

Вчера я на ощупь подбирал код вот к такому замку от подъезда:

Такой замок относительно легко взломать, нужно просто найти самые отполированные кнопки с мягкими (изношеными) пружинами.

Но если таких кнопок 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)

C(10,2)+C(10,3)=165

165 возможных вариантов: при должном упорстве можно вручную их все перепробовать.

Попробуйте решить эту задачку без помощи комбинаторики или itertools в Питоне. В лучшем случае, вы придете к чему-то похожему и переизобретете велосипед (что, кстати, оч. полезно для (само)обучения). В худшем случае, ваш код будет слишком громоздким.

(the post first published at 20241108.)


List of my other blog posts.

Subscribe to my news feed,

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.