Трещина в процессе


57

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



1
Обязательно ли разделять строки вывода \r(заставляя их все заменять друг друга на экране, как в анимации), или это \nприемлемо?

1
@ ais523 \nвполне приемлемо. Версия с \rздесь только потому, что выглядит лучше, но она вам не нужна \r.
Дада

Если случайное поколение взломало пароль раньше, можно ли остановиться на этом этапе?
Джонатан Аллан

3
Разве вы не должны включать в правила, что случайные символы не должны быть действительными в этом месте ? В противном случае случайные строки могут соответствовать заданному паролю, но поиск продолжается, какие баффы фильма будут расцениваться как сбой.
Том

Ответы:



29

HTML / JavaScript, 170 168 167 байт

setInterval('o.textContent=i.value.replace(/./g,(c,i)=>new Date-d>++i*1e3?c:String.fromCharCode(Math.random()*95+32))',d=50)
<input id=i oninput=d=Date.now()><pre id=o>

Редактировать: 2 байта сохранены благодаря @ETHproductions. Сохранено 1 байт благодаря @jrich.


Не проверял это, но я верю, setIntervalчто примет строку для eval'd, которая потенциально может сохранить байт? setInterval('o.textContent...',d=50)сохраняет _=>и добавляет пару цитат
Jrich

@jrich Это было удобно, так как я забыл обновить счетчик байтов!
Нил

20

Узел, 145 142 байта

for(s=process.argv[2],d=new Date;s[a=(new Date-d)/1e3|0]+console.log(s.replace(/./g,(c,i)=>i<a?c:String.fromCharCode(32+Math.random()*95))););

Это кажется немного длинным, и, вероятно, есть немного места для игры в гольф. Обратите внимание, что точка с запятой в конце обязательна; без него программа выдает синтаксическую ошибку, потому что forоператор не имеет тела.

Выводит более 20 строк в секунду; маленькая птичка сказала мне, что это примерно 12 тысяч. Вот как это выглядит в эмуляторе терминала ConEmu на моем компьютере (скорость записи 30 кадров в секунду):

введите описание изображения здесь


10

05AB1E , 26 байт

Я публикую это как другой ответ относительно другого ответа 05AB1E, так как подход отличается

.põ¸ì¨vT·FyžQ.r¹gyg-£«}}¹»

.p                         Generate ordered prefix of input (e.g., ["a", "ab", "abc", "abcd", "abcde"] for "abcde")
  õ¸ì                      Prepend an empty string (e.g., result is ["", "a", "ab", ...])
     ¨                     Strip the last element (the same string as the input)
      v                    For each string in the array
       T·F                 For N in range(20)
          y                Push the current string
           žQ.r            Push all printable characters, shuffled
               ¹gyg-       Take the difference between the length of the input and the length of the current string -> x
                    £      Take the x first characters from the shuffled printable characters
                     «     Yield currentString + shuffledCharacters
                      }    End inner for
                       }   End outer for
                        ¹  Push input (last iteration)
                         » Join everything with newlines and implicitly display

Попробуйте онлайн!


Хороший ответ, +1 от меня! ПРИМЕЧАНИЕ: это может быть 22 байта с более новыми встроенными функциями в эти дни: ηвместо .p; õš(где šprepend в виде списка) вместо õ¸ì(где ¸ìwrap в списке и prepend); (где 26, если второй ввод не задан) вместо (то есть push 10 и double); ]вместо }}(где ]закрываются все циклы, операторы if-else и т. д. одновременно)
Кевин Круйссен,

8

BASH, 99 93 92 91 88 байт

с tr+ head+urandom

while ((${#1}-n));do
echo "${1::n=SECONDS}`tr -dc \ -~</dev/ur*|head -c$[${#1}-n]`"
done

(спасибо @manatwork)


5
[ "$n" = ${#1} ]((n==${#1})); ${1:0:$n}${1::n}
manatwork

@ Manatwork: Вау!
Ипор Сирсер

1
Еще 1: пробел перед перенаправлением ввода <не требуется.
Манатворк

1
@manatwork ((n==${#1}))->((${#1}-n))
Ipor Sircer,

1
Либо потому, что вы изменили логику, либо потому, что я ударил свой предыдущий тест, но, ${1::n=SECONDS}похоже, сейчас работает
manatwork


6

C 182 176 128 126 125 байтов

Golfed:

i;s;n;x;g(char*c){time(&s);while(c[++x]);do{n=time(0)-s;for(i=0;i<x;i++)putchar(i<n?c[i]:32+rand()%95);puts("");}while(n<x);}

Ungolfed:

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int i,s,n,x;
void g(char* c) {
  time(&s); //Get the initial time
  while(c[++x]); // x = strlen(c) (happy about this one)
  do {
    n = time(0) - s; //seconds since beginning
    for(i = 0; i < x; i++)
      //after each second, print another char of the password
      putchar(i < n ? c[i] : 32 + rand() % 95);
    puts("");
  } while(n < x); //while we haven't printed the whole word
}

Я слышал, что можно отбросить некоторые стандартные #includes, но я не смог заставить его работать на компиляторе MingW GCC, который я только что скачал. Также не могу понять, как #define b #includeбез использования большего количества места, чем оно того стоило. Я просто идиот, прекрасно работает без них.


X = 0 не требуется, вместо этого объявите его с другими подобными, a,b,c,d;потому что все глобальные переменные, объявленные таким образом, являются int и init также 0, так как вы ничего не возвращаете, вы должны написать это в main ()
Mukul Kumar

1
Спасибо, я не знал о статической инициализации области. Я объявил их так, просто с запятой вместо запятых. Также я не использовал main, потому что я думаю, что тогда мне нужно взять (int argc, char ** argv), и это тонна байтов. Я надеюсь, что оставить его как функцию можно, хотя он принимает входные данные в качестве параметра и выводит в стандартный вывод, что немного странно.
nmjcman101

1
Используйте while(i++<x) вместоfor (...)
Mukul Kumar

Действительно хорошая идея, но iдолжен быть нулевым каждый раз, когда цикл for запускается снова.
nmjcman101

Затем в том же forзаменить i <xс i++<xи удалитьi++
Мукул Кумар

5

Java 7, 271 265 207 байт

void c(String s)throws Exception{for(int i=0,j,l=s.length();i<=l*20;i++){String r=s.substring(0,i/20);Thread.sleep(45);for(;j++<l;r+=(char)(32+Math.random()*95);System.out.println(r);if(s.equals(r))return;}}

-58 байтов сохранено благодаря @ OliverGrégoire . ( Не забудьте высказать его даже более короткий ответ Java 8. )

Ungolfed:

void c(String s) throws Exception{
  for(int i = 0, j, l = s.length(); i <= l*20; i++){
    String r = s.substring(0, i/20);
    Thread.sleep(45);
    for( ; j++ < l; r += (char)(32+Math.random()*95));
    System.out.println(r);
    if(s.equals(r)){
      return;
    }
  }
}

Вход: abcde
Выход:

введите описание изображения здесь


Я не уверен, что вы разработали его специально для печати только 20 строк в секунду, но если это поможет вам в игре в гольф, вам нужно будет печатать не менее 20 строк в секунду. Я не знаю, поможет ли изменение математики «20 строк в секунду» на «менять каждую секунду» или нет.
nmjcman101

Вам не нужно x: r+=(char)(33+Math.random()*94). Также, Thread.sleep(9)чтобы сохранить байт.
Оливье Грегуар

1
Кроме того, r=s.substring(0,i/20)вместо цикла на j.
Оливье Грегуар,

Учитывая значительные изменения, которые я сделал, я решил опубликовать свой ответ с учетом этих комментариев. Кроме того, это решение на Java 8, которое идет с небольшим количеством байтов (в Java, ofc).
Оливье Грегуар

@ OlivierGrégoire Спасибо. И я проголосовал за твой ответ. Я не сделал все изменения, только r.substring(0,i/20)(довольно глупо с моей стороны) и (char)(33+Math.random()*94)(хороший трюк от вас).
Кевин Круйссен

4

WinDbg, 400 391 байт

.for(r$t1=@$t0;by(@$t1);r$t1=@$t1+1){};m@$t0 L@$t1-@$t0+1 @$t1+1;r$t4=2*@$t1+2-@$t0;r$t8=@$t4+f;r$t3=0;.for(r$t2=0;@$t2<@$t1-@$t0;da@$t0){.for(r$t7=@$t0+@$t2;by(@$t7);r$t7=@$t7+1;r$t8=@$t8+1){eb@$t7 by(@$t8)%5e+20};r$t9=0;.foreach(p {.echotime}){.if7==@$t9{ea@$t4"p";.if1>@$t3{r$t3=by(@$t4+7)}};r$t9=@$t9+1};j@$t3!=by(@$t4+7)'m@$t0+@$t4-@$t1+@$t2-1 L1 @$t0+@$t2;r$t2=@$t2+1;r$t3=by(@$t4+7)'}

-9 байт за счет упрощения математики

Это определенно не похоже на то, для чего предназначен WinDbg. ;)

Ввод осуществляется путем ввода строки ascii в ячейку памяти и установки этого адреса в псевдорегистр $t0. Например:

r$t0 = 2000000
eza @$t0 "abcde"

Я использую prng независимо от содержимого в памяти, несколько байтов после входной строки. После этого Chrome.exe заполняет пространство памяти 0x2000000байтами, которые выглядят достаточно случайно, поэтому я использовал дамп chrome.exe. Неизвестно, равномерно ли это, но выглядит достаточно случайным для меня.

Как это устроено:

.for(r$t1=@$t0; by(@$t1); r$t1=@$t1+1){};         * From $t0, increment $t1 until the byte
                                                  * at $t1 is 0 to find length of input
m@$t0 L@$t1-@$t0+1 @$t1+1;                        * Duplicate input (memory 
                                                  * becomes: "input\0input\0")

r$t4=2*@$t1+2-@$t0;                               * Set $4 to the byte after \0 of the 
                                                  * duplicated input
r$t8=@$t4+f;                                      * Set $t8 to $t4+15, this is the prng
r$t3=0;                                           * Init $t3=0, this will hold the time

.for(r$t2=0; @$t2<@$t1-@$t0; da@$t0){             * For $t2=0, loop until it's input length,
                                                  * printing the string at $t0 after each
                                                  * loop. $t0 is where the password crack
                                                  * progress is written.
    .for(r$t7=@$t0+@$t2; by(@$t7); r$t7=@$t7+1;   * Loop over each uncracked char
                                   r$t8=@$t8+1){  * also incrementing prng ($t8)
        eb@$t7 by(@$t8)%5e+20                     * Write a visible ascii char onto the
                                                  * uncracked char position based on the 
                                                  * current byte of prng%0x5e+0x20 (prng%126+32)
    };

    r$t9=0;                                       * Set $t9=0 for updating current time
    .foreach(p {.echotime}){                      * For each (string) word in a statement
                                                  * like "Debugger (not debuggee) time: Mon 
                                                  * Nov 21 18:23:08.433 2016 (UTC - 8:00)"
        .if7==@$t9{                               * If the 7th word, ie- the current time
            ea@$t4"p";                            * Write the time at $t4
            .if1>@$t3{                            * If $t3 has not been set yet
                r$t3=by(@$t4+7)                   * ...save the current second in $t3
            }
        };
        r$t9=@$t9+1                               * Increment $t9 until it's 7
    };

    j@$t3!=by(@$t4+7)'                            * If the current second has changed
        m@$t0+@$t4-@$t1+@$t2-1 L1 @$t0+@$t2;      * Copy the cracked char from dupe input
        r$t2=@$t2+1;                              * Increment $t2 (loop ends when this is input length)
        r$t3=by(@$t4+7)                           * Save the new current second
    '
}                                                 * Final crack is printed by for loop

Примечание: некоторые байты могут быть обработаны гольфом, используя jвместо .if's', но это заставляет его работать на моей машине слишком медленно, поэтому он не выдает по крайней мере 20 строк в секунду, поэтому не сохраняет эти байты.

Пример вывода: http://pastebin.com/H4H74sAx


4

R 138 байт

z=Sys.time;n=nchar(x<-scan(,""));s=z();t=0;while(t<=n){t=t+z()-s;cat(substr(x,1,f<-floor(t)),intToUtf8(sample(32:126,n-f,T)),"\n",sep="")}

Читает ввод из стандартного ввода.

На моей машине насчитывается примерно 61 строка между каждой дополнительной буквой в «пароле».


4

Баш, 247 245 212 207 байт

R()(echo $SECONDS);w=`R`;until [ "$a" = "$1" ];do for i in `seq 1 $[${#1}-${#a}]`;{ a+=`printf "\x$(printf %x $[$RANDOM%127+32])"`;};echo -e "$a\r";a=${1:0:q};((`R`-w>0))&&{ w=`R`;((q++));}||:;done;echo "$a"

Большое спасибо Bash за то, что он так чувствителен к пробелам ...

В любом случае, вывод дается в режиме реального времени на отдельных строках. Сохранить как .shскрипт и вызвать с помощью:

bash <File Name>.sh <Input>

Например, bash Cracking_In_Progress.sh okayertyприводит к следующему выводу, записанному со скоростью 30 кадров в секунду:

Пример вывода


4

Haskell (GHC), 202 байта

import System.Random
import Control.Concurrent
f s|l<-length s=mapM_(\n->putStr('\r':take n s)>>mapM(\_->toEnum<$>randomRIO(32,126))[1..l-n]>>=putStr>>threadDelay 50000)$[n|n<-[0..l-1],f<-[1..20]]++[l]

-5 байт без вычурного возврата каретки

введите описание изображения здесь


Выглядит неплохо! Но что это >делает в конце вывода?
Мачта

3
@ Мач, это подсказка. Так как код не печатает перевод строки в конце, приглашение отправляется туда.
Angs

4

MATL , 26 байт

`GZ`:)' ~'olGn4Mk-I$YrhD7M

Попробуйте онлайн!

Ниже вывод в реальном времени от автономного компилятора. Обратите внимание, что анимированный GIF был записан со скоростью 20 кадров в секунду, чтобы сохранить его небольшой размер, но фактическая скорость намного выше.

введите описание изображения здесь

Как это устроено

           % Implicitly start timer
`          % Do...while
  G        %   Push input
  Z`       %   Push timer's current value, say t
  :)       %   Select the first t elements of the input, with t
           %   implicitly rounded down
  ' ~'     %   Push this string
  o        %   Convert to numbers, i.e. [32 126]
  l        %   Push 1
  Gn       %   Push input size, say n
  4Mk      %   Push floor(t), where t is the same value used above
  k        %   Subtract. Gives n-floor(t)
  I$Yr     %   Generate a row vector of n-floor(t) integers randomly
           %   chosen from 32 to 126
  h        %   Concatenate with the first characters of the input
  D        %   Display
  7M       %   Push the value n-floor(t) used above. This is used
           %   as loop condition: iz zero the loop is exited 
           % Implicit end

2
Этот код так счастлив. :)
sethmlarson

@SethMichaelLarson Это потому, что его кавычки сбалансированы, чего обычно не бывает :-)
Луис Мендо

3

Python3, 149 141 139 байт

import time,random
i,x=input(),0;l=len(i)
while x<l:x=int(time.clock());print(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))

Ввод от стандартного ввода.

Версия для глаз (157 байт):

import time,random
p,i,x=print,input(),0;l=len(i)
while x<l:x=int(time.clock());p(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)),end="\r")
p(i)

1
Я думаю, что вы можете сэкономить несколько байтов, не «переименовывая» вещи, которые вы делаете только один раз. Например, у вас есть t=time.clock, но вы используете только один раз в коде. Замена его всего лишь time.clockсэкономит 3 байта. То же самое для печати.
nmjcman101

@ nmjcman101 Ой, перенести с пред. Спасибо!
matsjoyce

Также ваш for _ in range(l-x)может быть for _ in"a"*(l-x)на 2 байта.
nmjcman101

@ nmjcman101 Отлично! Я должен помнить тот ...
matsjoyce

Попробуйте 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)))
x1Mike7x

3

Node.js, 134 байта

for(s=[...process.argv[2]],n=new(d=Date);s[m=(new d-n)/1e3|0]+console.log(s.map((a,i)=>i<m?a:Buffer([Math.random()*95+32])).join``););

Похож на @ETHproductions (позаимствовал некоторые из его оптимизаций), но в остальном использует другой подход. Использует Node Bufferдля обработки генерации символов вместо longy String.fromCharCode, что дает дополнительное преимущество, позволяя нам использовать mapбез особых затрат на преобразование строк-> массив-> строк.


Хорошо, я должен узнать больше о Buffer. Просто чтобы вы знали, переназначение Dateна Dне сохраняет никаких байтов; Я попробовал это сам.
ETHproductions

3

Python 3, 167 166 байт

import time,random
t=time.time
p,s=input(),t()
while t()-s<len(p):print(p[:int(t()-s)]+''.join(chr(random.randint(32,126))for _ in range(len(p)-int(t()-s))))
print(p)

Читает ввод из стандартного ввода. 171-байтовая версия работает под Python 2 (заменено inputна raw_input):

import time,random
t=time.time
p,s=raw_input(),t()
while t()-s<len(p):print(p[:int(t()-s)]+''.join(chr(random.randint(32,126))for _ in range(len(p)-int(t()-s))))
print(p)

Ungolfed:

import random
import time

p = input()
start = time.time()
while time.time() - start < len(p): 
    print(
        p[:int(time.time() - start)] + 
        ''.join(chr(random.randint(32, 126)) for _ in range(len(p) - int(time.time()-start)))
    )
print(p)

3

Дьялог АПЛ , 59 58 байт

Решение

Требуется ⎕IO←0по умолчанию во многих системах.

⊢⊣≢{⍵{≢⎕←⍵↑⍺,⎕UCS 32+?⍵⍴95}⍣{t2⊃⎕AI}⍺⊣t1E3+2⊃⎕AI}¨⍳∘≢↑¨⊂

дисплей

Приспосабливая окно к двум строкам, мы получаем иллюзию преобразования на месте:
Анимация взлома кода Dyalog APL

объяснение

Это последовательность анонимных функций, которая принимает пароль в качестве правильного аргумента.

⊢⊣ вернуть пароль и отклонить результат

≢{... функция ниже, с длиной пароля в качестве левого аргумента, применяется к каждому из

2⊃⎕AIтекущее время работы (освещенный третий элемент информации A ccount I )

1E3+ добавить секунду

t←назначить это т

отклонить это

⍵{... }⍣{t≤2⊃⎕AI}⍺применять следующую функцию (с подстрокой как и длиной пароля как ) несколько раз, пока время работы не достигнет t

  ⍵⍴95 95 повторяется столько раз, сколько символов в пароле

  ? случайное целое число 0 ... 94

  32+добавить 32 (получая, таким образом, случайных чисел в диапазоне 32 ... 126)

  ⎕UCS преобразовать в символ Unicode

  ⍺, добавить текущую обработанную подстроку

  ⍵↑ взять только столько символов, сколько есть в пароле

  ⎕← выведите это на отдельной строке

   вернуть длину выведенной строки (= длина пароля)

⍳∘≢ 0 ... длина-1

↑¨каждый из которых принимает персонажей из

пароль


2

Java, 159 байт

s->{for(int i=0,j,l=s.length();i<=l*99;i++){String r=s.substring(0,j=i/20);Thread.sleep(9);for(;j++<l;r+=(char)(32+Math.random()*95));System.out.println(r);}}

Тот же алгоритм, что и в ответе Кевина Круйссена , только полностью оптимизирован для Java 8.

Ungolfed:

public class Tmp {

  interface X {

    void f(String s) throws Exception;
  }
  static X f = s -> {
    for (int i = 0, j, l = s.length(); i <= l * 20; i++) {
      String r = s.substring(0, j = i / 20);
      Thread.sleep(48);
      for (; j++ < l; r += (char) (32 + Math.random() * 94));
      System.out.println(r);
    }
  };

  public static void main(String[] args) throws Exception {
    f.f("abcde");
  }
}

1

C #, 203 197 195 190 байтов

Golfed:

void F(string s){int l=s.Length,t=0;var w=Stopwatch.StartNew();do{if(w.Elapsed.Seconds>t)t++;Console.WriteLine($"{s.Substring(0,t)}{Path.GetRandomFileName().Substring(0,l-t)}");}while(t<l);}

Ungolfed:

    void F(string s)
    {
        int l = s.Length, t = 0;
        var w = Stopwatch.StartNew();

        do
        {
            if (w.Elapsed.Seconds > t)
                t++;

            Console.WriteLine($"{s.Substring(0, t)}{Path.GetRandomFileName().Substring(0, l - t)}");
        } while (t < l);
    }

l хранит длину ввода.

StopWatchи Path.GetRandomFileName()являются частью .NET Framework.

EDIT1: неявное Stopwatchобъявление.

EDIT2: lинициализация объединена с декларацией.

EDIT3: Спасибо, Крис.


Вы можете использовать статический метод Stopwatch.StartNew (), чтобы сохранить обновление секундомера и его явный запуск
Chris

@ Крис, я не знал об этом методе, спасибо.
Paldir

t++может быть вставлен где-то вif ()
Mukul Кумар

@MukulKumar Не могли бы вы предоставить более подробную информацию, пожалуйста?
Paldir

Используйте if (w.Elapsed.Seconds > t++)и удалитеt++;
Mukul Kumar

1

Scala, 259 254 248 233 232 231 227 225 байт

import scala.concurrent.duration._;(b:String)=>{val d=b.length.seconds.fromNow;while(d.hasTimeLeft)println(b.zipWithIndex.map{case(f,g)=>if(g<b.length-d.timeLeft.toSeconds-1)f else(32+math.random*94)toChar}mkString);print(b)}

Ungolfed:

import scala.concurrent.duration._;

(b:String) => {
    val d = b.length.seconds.fromNow;
    while(d.hasTimeLeft)
        println(
            b.zipWithIndex.map{
                case(f,g) => 
                    if(g<b.length-d.timeLeft.toSeconds-1)
                        f 
                    else
                        (32+math.random*94)toChar}
            mkString
        );

    print(b)
}

1

ForceLang , 322 309 байт

def s set
s g goto
s W io.writeln
s k io.readln()
s T timer.new()
def a T.poll()
label 1
s P math.floor a.mult 1e-6
if P=k.len
 W k
 exit()
s j 0
s t ""
if P=0
g 4
label 3
s v k.charAt j
s t t+v
s j 1+j
if j-P
g 3
label 4
if j=k.len
 W t
 g 1
s r 94.mult random.rand()
s v string.char 32+r
s t t+v
s j 1+j
g 4

Не могли бы вы добавить ссылку на используемый вами язык программирования?
Соломон Уко

@SolomonUcko Вот, пожалуйста.
SuperJedi224

1

C ++ (gcc) , 280 278 байт

#include<iostream>
#include<chrono>
#include<cstdlib>
#include<thread>
int i,n,t,q;void f(std::string s){for(t=s.size(),n=0;n<=t;n++)for(q=n<t?20:1;q--;std::this_thread::sleep_for(std::chrono::milliseconds(50)))for(std::cout<<"\n"<<s.substr(0,i=n);i++<t;)putchar(32+rand()%84);}

Попробуйте онлайн!

Он просто печатает 20 случайных строк, ожидая 50 std::chrono::millisecondsмежду собой (выводя ровно 20 строк в секунду), а затем переходит к следующему шагу «взлома».


1

Go , 244 байта

import(."fmt"
."math/rand"
."time")
func a(s string){Seed(Now().Unix())
for i:=0;i<len(s);i++{t:=Now().Truncate(Second).Add(Second)
for Now().Before(t){q:=[]rune(s)
for p:=len(q)-1;p>=i;p--{q[p]=rune(32+Intn(95))}
Println(string(q))}}
Print(s)}

Попробуйте онлайн! (обрезает результат, чтобы он не показывал каждый экземпляр)

Это мой первый ответ на Голанге \ о /

введите описание изображения здесь

(Снято при 30 кадрах в секунду)

Как:

func a(s string) {                      //function a
Seed(Now().Unix())                      //Create a seed for the pRNG
for i := 0; i < len(s); i++ {           //set helper var i (this is the number of characters we'll keep)
t := Now().Truncate(Second).Add(Second) //set helper var t = 1 second from now
for Now().Before(t) {                   //while inside that 1 second window
q := []rune(s)                          //put each character in a rune slice and assign that to q
for p := len(q) - 1; p >= i; p-- {      //loops through the rune slice
q[p] = rune(32 + Intn(95))              //replace the character in position p with a random code point in [32,126]
}
Println(string(q))                      //print the rune slice as a string
}
}
Print(s)                                //finally, print the original string
}

0

PHP, 222 байта

$a=$argv[1];$c=range(32,126);$t=time();$s=$t;$e=$t+strlen($a);while(time()<=$e){$l=time();$p=$l-$s;$x=substr($a,0,$p);$k=$e-$l;$r='';for($i=$k;$i>0;$i--)$r.=chr($c[rand(0,94)]);$o=$x.$r;echo"$o\n";if($o==$a&&$l==$e)break;}

Ungolfed

<?php
$input = $argv[1];
$chars = range(32, 126); // count() is 95

$startTime = time();
$endTime = time() + strlen($input);

while (time() <= $endTime) {
    $plaintextAmountToPrint = time() - $startTime;

    $plain = substr($input, 0, $plaintextAmountToPrint);

    $cryptAmountToPrint = $endTime - time();

    $crypt = '';

    for ($i = $cryptAmountToPrint; $i > 0; $i--)
        $crypt .= chr($chars[rand(0, 94)]);

    $output = $plain . $crypt;

    echo $output . "\n";

    if ($output == $input && time() == $endTime)
        break;
}

(я знаю, что видео это дерьмо) введите описание изображения здесь


Это может быть гораздо больше. Например, вместо, $c=range(32,127)а потом $r=chr($c[rand(0,94)]), почему не просто $r=chr(rand(0,94)+32)?
Ксандерхолл

Хорошая точка зрения. Это мой первый гольф: P
Нино Шкопац

<?$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 байт, и я уверен, что это может быть в гольфе дальше
Ксандерхолл

Круто, ты должен опубликовать этого человека.
Нино Шкопац

Просто отредактируйте свой ответ, вы можете изменить и улучшить его.
Ксандерхолл

0

Tcl , 295 байт

Первый гольф для меня в Tcl. Язык не очень удачный для игры, поскольку здесь все рассматривается как строки, поэтому пробел обычно является обязательным ...

set l [string length $argv];set s [clock seconds];set r -1;while {$r<$l-1} {puts -nonewline [string range $argv 0 $r];set k $l;while {[set k [expr $k-1]]>$r} {puts -nonewline [format %c [expr int(rand()*95+32)]]};puts "";if {[expr [clock seconds]-$s]>[expr $r+1]} {set r [expr $r+1]}};puts $argv

Ungolfed:

set l [string length $argv]
set s [clock seconds]
set r -1
while {$r < $l-1} {                                      # loop on time
  puts -nonewline [string range $argv 0 $r]
  set k $l
  while {[set k [expr $k-1]] > $r} {                     # loop on "unfound" chars
    puts -nonewline [format %c [expr int(rand()*95+32)]]
  }
  puts ""
  if {[expr [clock seconds]-$s] > [expr $r+1]} {         # advance time
    set r [expr $r+1]
  }
}
puts $argv

Почему бы вам не сохранить выходные данные в переменной, а затем объединить их все, чтобы избежать -nonewlineиспользования putsпараметра?
sergiol

Я думаю, что вам не нужны два exprв конце; одного достаточно, и вы также можете избежать пробелов вокруг >
sergiol

Спасибо @sergiol, нет пробелов вокруг>, посмотрите сокращенную версию. Пожалуйста, посоветуйте, как использовать один exprв конце, я не вижу его.
HDRZ

демо из моих двух предложений.
sergiol

1
[set k [expr $k-1]]может быть [incr k -1]. И каждый `<` может быть <без пробелов.
sergiol

0

Котлин, 188 байт

Golfed

val x=readLine()!!;val n=System::currentTimeMillis;val t=n();do{val s=(n()-t)/1000;x.mapIndexed{i,c->print(if(i<s)c else((Math.random()*(126-32))+32).toChar())};println()}while(s<x.length)

Ungolfed

val input = readLine()!!
val time = System::currentTimeMillis
val startTime = time()
do {
    val crackIndex = (time() - startTime) / 1000
    input.mapIndexed{ i, letter ->
        print(
            if (i < crackIndex) letter else ((Math.random()*(126-32))+32).toChar()
        )
    }
    println()
} while(crackIndex < input.length)

введите описание изображения здесь

Переименование System.currentTimeMillisсэкономило немало байтов!


0

QBIC , 92 88 байт

Я взломал это!

t=20;_LA|[a*t-t|B=$left$|(A,b/t)[a|B=B+$CHR$|(_r94|+32)]?$left$|(B,a)~b%t=0|$sleep 1|}?A

Это зависит от функции SLEEP QBasic, использующей литерал кода $sleep 1|, и от LEFT$функции QBasic, потому что я еще не реализовал эту функцию в QBIC ...

Удалось очистить несколько байтов, подставив все 20для tи установив их на 20. Кроме того, упростили вызов случайным образом и цикл FOR.

Объяснение:

' Get cmd line param with 'password' and the length of that string, set t to 20
t=20;_LA|

' loop from 1 (implicitly) to (#chars-1) * 20 cracks per char
[a*-t|

'have our crack-display start with the first N chars of
'the password, where N is the number of seconds passed   
B=$left$|(A,b/t)

' loop to add the 'crack-visual'
' It's too long, but we'll trim it down to the original length
[a|B=B+$CHR$|(_r92|+34)]?$left$|(B,a)

' if we've done 20 cracks, sleep for 1 second
~b%20=0|$sleep 1|}

' We've cracked it!
?A

Вывод (часть среднего раздела «helloworld»)

hewnoluZfs
heb!mrc2g@
hee+yh"5ut
he0?V+O)Uu
heqf(#M/BM
hez|DGX%a8
he<_n[6-.+
helkxQ#g%,
hel&^A9$I8
hel43{b5]t
helszK50%F
hel`kdy ;b
hel Vr6Z}s
helLIR7*7o 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.