Помните те программы перебора паролей, которые показывают каждую комбинацию, которую они пытаются? Точнее, в какой-то момент n первых символов являются фиксированными (они были успешно угаданы), и каждый возможный символ для оставшихся символов проверяется. Вы, наверное, видели некоторые в фильмах или в программном обеспечении, написанном людьми, которые любят модные интерфейсы.
Извините, что разочаровал, но мы не будем писать программу для взлома пароля, только одну, чтобы воспроизвести хороший вывод.
Вызов
Если задана строка, содержащая печатные символы ascii, но без перевода строки (код ascii с 32 по 126 или соответствующий регулярному выражению ^[ -~]{2,}$), выведите выходные данные в соответствии с этими правилами:
- Во время
t=n seconds, вnпервых символах , напечатанных являютсяnпервыми символами строки ввода. - После
nфиксированных символов вы должны добавить строку, сформированную случайным символом (выбранным равномерно псевдослучайно из диапазона Юникоддо~(код 32 до 126)), чтобы сформировать строку длины исходного. - Вы должны выводить не менее (подробнее об этом позже) 20 строк каждую секунду: у каждого из них будут одинаковые
nпервые символы, но разный случайный конец.
Вероятно, еще не очень ясно, что вы должны делать, поэтому давайте рассмотрим пример:
пример
Я буду печатать только 5 разных строк за каждую секунду вместо 20 минимум, чтобы сделать его более читабельным.
Рассмотрим вход abcde.
В течение первой секунды действительный вывод может быть что-то вроде (совершенно случайно):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Затем t=1первый символ каждой следующей строки будет a(первый символ ввода):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Теперь t=2первые два символа будут ab:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Теперь t=3первые три символа будут abc:
abcvW
abc3G
abc(g
abc{@
abc@4
Теперь t=4первые четыре символа будут abcd:
abcdD
abcdv
abcdj
abcd$
abcd6
Наконец, t=5мы печатаем ввод (только один раз):
abcde
Несколько точности
- Вы не должны слишком беспокоиться о точности вашего языка в секундах (т. Е. Если ваш алгоритм верен, но вашей системе / языку не хватает точности, это нормально).
- Первая секунда может быть короче одной секунды (то есть, если вы запускаете свою программу в течение секунды, первая секунда может быть только оставшимся временем до конца текущей секунды). Иными словами, вам не нужно ждать начала новой секунды, чтобы начать печатать результаты.
- По крайней мере, 20 строк в секунду : более естественный путь - бесконечный цикл со специальным поведением каждую секунду (или тайм-аут или что-то в этом роде), так что это приведет, вероятно, к нескольким тысячам строк в секунду (и это прекрасно! ). Но если у вас есть другая идея, не стесняйтесь использовать ее, если вы печатаете не менее 20 строк в секунду.
- Ввод всегда будет более 2 символов.
- Вы можете считать, что длина ввода не будет превышать 30 символов, если это поможет. (Но если это работает для более длинных, это к лучшему)
- Формат ввода должен быть наиболее естественным представлением строки на вашем языке.
- Вам разрешено печатать завершающий символ новой строки.
Пример кода
Если вы все еще не понимаете, что именно вам нужно сделать, вы можете запустить следующий код в терминале Linux, чтобы увидеть:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Критерий победы
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
Спасибо Laikoni и Flp.Tkc за их предложения и улучшения в песочнице.
\r(заставляя их все заменять друг друга на экране, как в анимации), или это \nприемлемо?
\nвполне приемлемо. Версия с \rздесь только потому, что выглядит лучше, но она вам не нужна \r.








