Помните те программы перебора паролей, которые показывают каждую комбинацию, которую они пытаются? Точнее, в какой-то момент 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
.