Помните те программы перебора паролей, которые показывают каждую комбинацию, которую они пытаются? Точнее, в какой-то момент 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
.Ответы:
Pyth -
2724 байтаЭто на самом деле выглядит довольно круто: D
Попробуйте это онлайн здесь (очевидно, не в режиме реального времени, но если вы прокрутите его вниз устойчивой рукой).
источник
HTML / JavaScript,
170168167 байтРедактировать: 2 байта сохранены благодаря @ETHproductions. Сохранено 1 байт благодаря @jrich.
источник
setInterval
что примет строку для eval'd, которая потенциально может сохранить байт?setInterval('o.textContent...',d=50)
сохраняет_=>
и добавляет пару цитатУзел,
145142 байтаЭто кажется немного длинным, и, вероятно, есть немного места для игры в гольф. Обратите внимание, что точка с запятой в конце обязательна; без него программа выдает синтаксическую ошибку, потому что
for
оператор не имеет тела.Выводит более 20 строк в секунду; маленькая птичка сказала мне, что это примерно 12 тысяч. Вот как это выглядит в эмуляторе терминала ConEmu на моем компьютере (скорость записи 30 кадров в секунду):
источник
05AB1E , 26 байт
Я публикую это как другой ответ относительно другого ответа 05AB1E, так как подход отличается
Попробуйте онлайн!
источник
η
вместо.p
;õš
(гдеš
prepend в виде списка) вместоõ¸ì
(где¸ì
wrap в списке и prepend);₂
(где₂
26, если второй ввод не задан) вместоT·
(то есть push 10 и double);]
вместо}}
(где]
закрываются все циклы, операторы if-else и т. д. одновременно)BASH,
99 93 92 9188 байтс
tr
+head
+urandom
(спасибо @manatwork)
источник
[ "$n" = ${#1} ]
→((n==${#1}))
;${1:0:$n}
→${1::n}
<
не требуется.((n==${#1}))
->((${#1}-n))
${1::n=SECONDS}
похоже, сейчас работает05AB1E, 30 байтов
Использует кодировку CP-1252 . Попробуйте онлайн!
Пожалуйста, помогите мне сыграть в гольф.
источник
C
182176128126125 байтовGolfed:
Ungolfed:
Я слышал, что можно отбросить некоторые стандартныеЯ просто идиот, прекрасно работает без них.#include
s, но я не смог заставить его работать на компиляторе MingW GCC, который я только что скачал. Также не могу понять, как#define b #include
без использования большего количества места, чем оно того стоило.источник
a,b,c,d;
потому что все глобальные переменные, объявленные таким образом, являются int и init также 0, так как вы ничего не возвращаете, вы должны написать это в main ()while(i++<x)
вместоfor (...)
i
должен быть нулевым каждый раз, когда цикл for запускается снова.for
заменитьi <x
сi++<x
и удалитьi++
Java 7,
271265207 байт-58 байтов сохранено благодаря @ OliverGrégoire . ( Не забудьте высказать его даже более короткий ответ Java 8. )
Ungolfed:
Вход:
abcde
Выход:
источник
x
:r+=(char)(33+Math.random()*94)
. Также,Thread.sleep(9)
чтобы сохранить байт.r=s.substring(0,i/20)
вместо цикла наj
.r.substring(0,i/20)
(довольно глупо с моей стороны) и(char)(33+Math.random()*94)
(хороший трюк от вас).WinDbg,
400391 байт-9 байт за счет упрощения математики
Это определенно не похоже на то, для чего предназначен WinDbg. ;)
Ввод осуществляется путем ввода строки ascii в ячейку памяти и установки этого адреса в псевдорегистр
$t0
. Например:Я использую prng независимо от содержимого в памяти, несколько байтов после входной строки. После этого Chrome.exe заполняет пространство памяти
0x2000000
байтами, которые выглядят достаточно случайно, поэтому я использовал дамп chrome.exe. Неизвестно, равномерно ли это, но выглядит достаточно случайным для меня.Как это устроено:
Примечание: некоторые байты могут быть обработаны гольфом, используя
j
вместо.if
's', но это заставляет его работать на моей машине слишком медленно, поэтому он не выдает по крайней мере 20 строк в секунду, поэтому не сохраняет эти байты.Пример вывода: http://pastebin.com/H4H74sAx
источник
R 138 байт
Читает ввод из стандартного ввода.
На моей машине насчитывается примерно 61 строка между каждой дополнительной буквой в «пароле».
источник
Баш,
247245212207 байтБольшое спасибо Bash за то, что он так чувствителен к пробелам ...
В любом случае, вывод дается в режиме реального времени на отдельных строках. Сохранить как
.sh
скрипт и вызвать с помощью:bash <File Name>.sh <Input>
Например,
bash Cracking_In_Progress.sh okayerty
приводит к следующему выводу, записанному со скоростью 30 кадров в секунду:источник
Haskell (GHC), 202 байта
-5 байт без вычурного возврата каретки
источник
>
делает в конце вывода?MATL , 26 байт
Попробуйте онлайн!
Ниже вывод в реальном времени от автономного компилятора. Обратите внимание, что анимированный GIF был записан со скоростью 20 кадров в секунду, чтобы сохранить его небольшой размер, но фактическая скорость намного выше.
Как это устроено
источник
Python3,
149141139 байтВвод от стандартного ввода.
Версия для глаз (157 байт):
источник
t=time.clock
, но вы используете только один раз в коде. Замена его всего лишьtime.clock
сэкономит 3 байта. То же самое для печати.for _ in range(l-x)
может бытьfor _ in"a"*(l-x)
на 2 байта.print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))
вместоprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
Node.js, 134 байта
Похож на @ETHproductions (позаимствовал некоторые из его оптимизаций), но в остальном использует другой подход. Использует Node
Buffer
для обработки генерации символов вместо longyString.fromCharCode
, что дает дополнительное преимущество, позволяя нам использоватьmap
без особых затрат на преобразование строк-> массив-> строк.источник
Buffer
. Просто чтобы вы знали, переназначениеDate
наD
не сохраняет никаких байтов; Я попробовал это сам.Python 3,
167166 байтЧитает ввод из стандартного ввода. 171-байтовая версия работает под Python 2 (заменено
input
наraw_input
):Ungolfed:
источник
Дьялог АПЛ ,
5958 байтРешение
Требуется
⎕IO←0
по умолчанию во многих системах.дисплей
Приспосабливая окно к двум строкам, мы получаем иллюзию преобразования на месте:
объяснение
Это последовательность анонимных функций, которая принимает пароль в качестве правильного аргумента.
⊢⊣
вернуть пароль и отклонить результат≢{
...}¨
функция ниже, с длиной пароля в качестве левого аргумента, применяется к каждому из2⊃⎕AI
текущее время работы (освещенный третий элемент информации A ccount I )1E3+
добавить секундуt←
назначить это т⊣
отклонить это⍵{
...}⍣{t≤2⊃⎕AI}⍺
применять следующую функцию (с подстрокой как ⍺ и длиной пароля как ⍵ ) несколько раз, пока время работы не достигнет t⍵⍴95
95 повторяется столько раз, сколько символов в пароле?
случайное целое число 0 ... 9432+
добавить 32 (получая, таким образом, ⍵ случайных чисел в диапазоне 32 ... 126)⎕UCS
преобразовать в символ Unicode⍺,
добавить текущую обработанную подстроку⍵↑
взять только столько символов, сколько есть в пароле⎕←
выведите это на отдельной строке≢
вернуть длину выведенной строки (= длина пароля)⍳∘≢
0 ... длина-1↑¨
каждый из которых принимает персонажей из⊂
парольисточник
Java, 159 байт
Тот же алгоритм, что и в ответе Кевина Круйссена , только полностью оптимизирован для Java 8.
Ungolfed:
источник
C #,
203197195190 байтовGolfed:
Ungolfed:
l
хранит длину ввода.StopWatch
иPath.GetRandomFileName()
являются частью .NET Framework.EDIT1: неявное
Stopwatch
объявление.EDIT2:
l
инициализация объединена с декларацией.EDIT3: Спасибо, Крис.
источник
t++
может быть вставлен где-то вif ()
if (w.Elapsed.Seconds > t++)
и удалитеt++;
Scala,
259254248233232231227225 байтUngolfed:
источник
ForceLang ,
322309 байтисточник
C ++ (gcc) ,
280278 байтПопробуйте онлайн!
Он просто печатает 20 случайных строк, ожидая 50
std::chrono::milliseconds
между собой (выводя ровно 20 строк в секунду), а затем переходит к следующему шагу «взлома».источник
Go , 244 байта
Попробуйте онлайн! (обрезает результат, чтобы он не показывал каждый экземпляр)
Это мой первый ответ на Голанге \ о /
(Снято при 30 кадрах в секунду)
Как:
источник
PHP, 222 байта
Ungolfed
(я знаю, что видео это дерьмо)
источник
$c=range(32,127)
а потом$r=chr($c[rand(0,94)])
, почему не просто$r=chr(rand(0,94)+32)
?<?$l=strlen($a=$argv[1]);$e=$l+$s=time();while(time()<=$e&&$o!=$a){$o=substr($a,0,time()-$s);while(strlen($o)<$l)$o.=chr(rand(0,94)+32);echo "$o\n";}
составляет 149 байт, и я уверен, что это может быть в гольфе дальшеTcl , 295 байт
Первый гольф для меня в Tcl. Язык не очень удачный для игры, поскольку здесь все рассматривается как строки, поэтому пробел обычно является обязательным ...
Ungolfed:
источник
-nonewline
использованияputs
параметра?expr
в конце; одного достаточно, и вы также можете избежать пробелов вокруг>
expr
в конце, я не вижу его.[set k [expr $k-1]]
может быть[incr k -1]
. И каждый `<` может быть<
без пробелов.Котлин, 188 байт
Golfed
Ungolfed
Переименование
System.currentTimeMillis
сэкономило немало байтов!источник
QBIC ,
9288 байтЯ взломал это!
Это зависит от функции SLEEP QBasic, использующей литерал кода
$sleep 1|
, и отLEFT$
функции QBasic, потому что я еще не реализовал эту функцию в QBIC ...Удалось очистить несколько байтов, подставив все
20
дляt
и установив их на 20. Кроме того, упростили вызов случайным образом и цикл FOR.Объяснение:
Вывод (часть среднего раздела «helloworld»)
источник