Тріск в процесі


57

Пам’ятаєте ті програми з грубою силою, щоб зламати пароль, який показує кожну комбінацію, яку вони намагаються? Точніше, в один момент зафіксовано п перших символів (вони були здогадані успішно), і кожен можливий символ для решти тестується. Напевно, ви бачили їх у фільмі чи в певному програмному забезпеченні, написаному людьми, які люблять фантазійні інтерфейси.
Вибачте, що розчарували, але ми не будемо писати програму для злому пароля, лише одну для відтворення приємного виводу.

Виклик

Враховуючи рядок, що містить символи 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 за їх пропозиції та вдосконалення в пісочниці.



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)економить _=>і додає пару цитат
червня 1616

@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; õš(де šподано як список) замість õ¸ì(де ¸ìобгортання у списку та препендія); (де 26, якщо не вказано другого вводу) замість (що є натисканням 10 та подвійним); ]замість }}(де ]одночасно закриваються всі цикли, висловлювання if-else тощо)
Кевін Круїссен

8

БАШ, 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

(Thx. до @manatwork)


5
[ "$n" = ${#1} ]((n==${#1})); ${1:0:$n}${1::n}
манатура

@manatwork: хто!
Іпор Сірсер

1
Ще 1: простір перед перенаправленням входу <не потрібен.
манатурка

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

1
Або тому, що ви перетворили логіку, або тому, що я пошкодив свій попередній тест, але, ${1::n=SECONDS}здається, зараз працює.
манатурка


6

C, 182 176 128 126 125 байт

Гольф:

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);}

Безголівки:

#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), і це - тона байтів. Я сподіваюся, що залишити це як функцію добре, хоча він вводить як параметр, а вихід у stdout, який трохи дивний.
nmjcman101

1
Використовуйте while(i++<x) замістьfor (...)
Мукул Кумар

Дійсно гарна ідея, але вона iповинна дорівнювати нулю кожен раз, коли цикл працює знову.
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. )

Безголівки:

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="")}

Читає дані від stdin.

Підрахував приблизно 61 рядок на моїй машині між кожним додатковим листом у "паролі".


4

Bash, 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
@Mast, це підказка. Оскільки в кінці код не друкує новий рядок, підказка надходить туди.
Ангс

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)))

Введення від stdin.

Версія для очей (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, але ви використовуєте t лише один раз у коді. Якщо замінити його просто, 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 (запозичив деякі його оптимізації), але в іншому випадку застосовує інший підхід. Використовує Вузол Bufferдля обробки генерування символів замість тривалого 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)

Читає дані з stdin. Версія з 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)

Безголівки:

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

Діялог APL , 59 58 байт

Рішення

Потрібно, ⎕IO←0що за умовчанням для багатьох систем.

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

Дисплей

Налаштовуючи вікно на два рядки, ми отримуємо ілюзію перетворення на місці:
Діалог анімації розтріскування коду APL

Пояснення

Це анонімний функціональний потяг, який приймає пароль як правильний аргумент.

⊢⊣ повернути пароль та відхилити результат

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

2⊃⎕AIток до часу (букв третього елемента A ccount Я ІНФОРМАЦІЯ)

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

t←призначити це 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.

Безголівки:

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 байт

Гольф:

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);}

Безголівки:

    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: Дякую, @Chris.


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

@Chris, я не знав про цей метод, thx.
paldir

t++можна вставити десь уif ()
Мукул Кумар

@MukulKumar Чи можете ви надати більше деталей?
paldir

Використовуйте if (w.Elapsed.Seconds > t++)та видалітьt++;
Мукул Кумар

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)}

Безголівки:

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

Ідіть , 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)}

Спробуйте в Інтернеті! (обрізає результат, щоб він не показував кожен примірник)

Це моя перша відповідь Golang \ o /

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

(Знято @ 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;}

Безумовно

<?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
Nino Škopac

<?$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 байт, і я впевнений, що в нього можна пограти далі
Xanderhall

Класно, ти повинен опублікувати цього чоловіка.
Ніно Шкопак

Просто відредагуйте свою відповідь, вам дозволяється змінити та вдосконалити її.
Ксандерхалл

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

Безголівки:

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параметра?
сергіол

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

Дякуємо @sergiol, пробілів навколо немає, подивись на стиснуту версію. Будь ласка, порадьте, як його використовувати exprв кінці, я не бачу цього.
hdrz

демонстрація двох моїх пропозицій.
сергіол

1
[set k [expr $k-1]]може бути [incr k -1]. І кожен "<" може бути <, пробіли не потрібні.
серхіол

0

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

Гольф

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)

Безумовно

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's на 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.