dabudi
@dabudi
2*2=5

Как реализовать генерацию всех комбинаций пароля по маске?

Подскажите как реализовать генерацию всех комбинаций по маске.
Есть маска !&&!!&&!, где ! - цифра, а & - буква.

С помощью itertools.product("ABC123", 3) можно сгенерировать все комбинации паролей, но я не понимаю, как реализовать функцию, которая будет генерировать все те же комбинации, но только по заданной маске.

Вот функция product:
def product(*args, repeat=1):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)


Если с дефолтной генерацией комбинаций все ясно, то не ясно как генерировать по маске.

Вот пример работы программы:
6346e36468e4d178611933.png

Помогите, пожалуйста.
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Очень просто. Смотри на первый пример:
product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
Генерятся комбинации из двух символов (так как два параметра). Причем первый параметр кодирует возможные первые символы, а второй - возможные вторые.

Нам нужно только обобщить это.

Идешь циклом по строке-маске и формируешь список, где каждый элемент - список подставляемых знаков, соответствующих текущему символу строки-маски. (Назовём этот список списков parts).
А дальше просто делаешь цикл for combo in product(*parts):
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Тебе нужно сгенерировать все 4х буквенные слова и потом четырех-циферные, соединить эти две коллекции декартово и потом просто расставить нужные буквы по нужным позициям.
Ответ написан
Комментировать
TalismanChet
@TalismanChet
Лицо зла
легко.
def mask_to_itert(mask: str):
    ret = []
    for i in mask:
        if i == "!":
            yield "ABC"
        elif i == "&":
            yield "123"
def product(mask: str, repeat: int = 1):
    return itertools.product(*mask)*repeat
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы