Пам’ятаєте ті програми з грубою силою, щоб зламати пароль, який показує кожну комбінацію, яку вони намагаються? Точніше, в один момент зафіксовано п перших символів (вони були здогадані успішно), і кожен можливий символ для решти тестується. Напевно, ви бачили їх у фільмі чи в певному програмному забезпеченні, написаному людьми, які люблять фантазійні інтерфейси.
Вибачте, що розчарували, але ми не будемо писати програму для злому пароля, лише одну для відтворення приємного виводу.
Виклик
Враховуючи рядок, що містить символи ascii для друку, але немає нових рядків (код ascii 32 до 126 або відповідає регулярному вираженню ^[ -~]{2,}$
), надрукуйте вихід, дотримуючись цих правил:
- Під час
t=n seconds
, вn
перших символах , надрукованих єn
першими символами рядка введення. - Після
n
фіксованих символів слід додати рядок, сформований випадковим символом (вибраним рівномірно псевдовипадковим чином, з діапазону Unicodeдо
~
(код 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
.