Генератор паролей с маской

Итак, задали мне тут задачку, нужно генерировать пароли по маске. При чем не просто генерировать, а выводить все доступные варианты.

Допустим у меня есть входная строка "123456[x][x]", где "123456" - маска. И есть строка alphabet, в которой лежат все символы, например "abcde". И мне нужно перебрать все варианты, например "123456ab", "123456ac", "123456ad" и тд. И я представляю себе как сделать это для одного или двух заменяемых символов, но если их будет больше? Голова уже болит, прошу помощи

Все это я буду собирать в android-прогу, выводящую результат. Не спрашивайте зачем, я и сам не знаю, такой заказ


Ответы (1 шт):

Автор решения: Павел Ериков

Если я правильно понял, как именно требуется генерировать текст, то вот сразу результат работы:

введите сюда описание изображения

При mask = "123456[x][x]" и alphabet = "abcde". (Так же алгоритм работает при любом кол-ве [x])

Если вам это и нужно, то объясню идею:

  1. Первое что я сделал, это нашел индексы [x], как будто это 1 символ. Например mask = 1[x]2345[x][x], то я получаю массив 1 6 7.

  2. Далее я заменяю все [x] на любой один символ, например ?.

  3. Потом пишем функцию NextSet для генерации размещений без повторений. Вот тут есть реализация на c++ (p.s. на сайте есть ошибка в функции j = n - 2, а не j = n - 1)

  4. Остается находить размещения alphabet длинной n по count, где count кол-во [x] в маске. И заменять по индексам найденным в 1 пункте символы из alphabet

Например mask = 123456[x][x], alphabet = abcde

  1. Массив с индексами [x] будет таким [6, 7]
  2. Далее получаем измененную строку, заменяя [x] на ?. В нашем случае она будет такой: genStr = 123456??
  3. ...
  4. Первое размещение alphabet будет [a, b], тогда по индексу 6 в строке genStr мы меняем этот символ на a, а по индексу 7 на b. Потом будет [a, c] делаем аналогично.

Все!

→ Ссылка