Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Перебор сообщений по 16 символов


Автор: rudolfninja 10.10.2014, 10:44
Ребята, приветствую.
Я понимаю, что идея - бред полный, но подскажите, пожалуйста, алгоритм перебора всех слов, состоящих из 16 символов из алфавита "abcdefghijklmnopqrastuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890". Можно использовать уже некоторые готовые решения, например, из <algorithm>.
Не спрашивайте зачем мне это надо и какое время это все займет. На первый вопрос я нормального ответа дать не смогу, а второй - понимаю.
В общем, если есть у кого какие идеи, поделитесь, пожалуйста.
Спасибо.

Автор: Akina 10.10.2014, 10:49
Это простая генерация всех 16-значных чисел в 52-ричной системе счисления.
В простейшем варианте - 16 вложенных FOR-ов.
Если есть дополнительные условия - например, неповторение символов, - то можно написать рекурсивную функцию генерации. Уровень вложенности 16 - это не так уж и много.

PS. Сто пудов не доживёшь...


Автор: rudolfninja 10.10.2014, 10:56
Цитата(Akina @  10.10.2014,  10:49 Найти цитируемый пост)
Это простая генерация всех 16-значных чисел в 52-ричной системе счисления.

В 62-ричной (26 верхний регистр, 26 - нижний, 10 - цифры) =)

Дополнительных условий хватает, но вряд ли они помогут.

Не могут быть только буквы верхнего или нижнего регистра.
Максимум может быть только 6 цифр
Больше 4 цифр подряд не может идти.
Сообщение не может состоять только из букв

Автор: Akina 10.10.2014, 11:07
Цитата(rudolfninja @  10.10.2014,  11:56 Найти цитируемый пост)
В 62-ричной 

Не суть... но дольше.

Цитата(rudolfninja @  10.10.2014,  11:56 Найти цитируемый пост)
Дополнительных условий хватает, но вряд ли они помогут.

При построении рекурсивной процедуры их можно учесть, введя соотв. флаги и счётчики, и по их значению фильтруя алфавит при передаче на следующий уровень рекурсии.

Автор: rudolfninja 10.10.2014, 11:18
Можно подробнее про рекурсивную функцию генерации? Желательно с каким-нибудь минимальным примером.

Автор: Akina 10.10.2014, 12:50
Ну схематичненько - так
Код

function generate(alphabet, currentlength, currentword)
if currentlength = 16 then
  print currentword
  exit function
end if
for i = 1 to lenght(alphabet)
  call generate (alphabet, curretlength+1, concat(currentword, alphabet(i)))
next i
end function

call generate("abcdefghijklmnopqrastuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 0, "")

Автор: rudolfninja 10.10.2014, 12:58
Вроде как, эта функция все время будет генерировать одно и тоже сообщение - первые 16 символов алфавита, не?

Автор: Akina 10.10.2014, 13:55
Лучше бы разобрал алгоритм, чем в небо пальцем тыкать...

Автор: rudolfninja 10.10.2014, 14:47
Спасибо, понял.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)