Retak dalam proses

57

Ingat program brute-force untuk memecahkan kata sandi yang menunjukkan setiap kombinasi yang mereka coba? Lebih tepatnya, pada satu titik, karakter n pertama diperbaiki (mereka telah berhasil ditebak), dan setiap karakter yang mungkin untuk yang tersisa sedang diuji. Anda mungkin pernah melihat beberapa di film, atau di beberapa perangkat lunak yang ditulis oleh orang-orang yang suka antarmuka mewah.
Maaf mengecewakan, tapi kami tidak akan menulis program untuk memecahkan kata sandi, hanya satu untuk mereproduksi output yang bagus.

Tantangan

Diberikan string yang mengandung karakter ascii yang dapat dicetak tetapi tidak ada baris baru (kode ascii 32 hingga 126 atau cocok dengan regex ^[ -~]{2,}$), cetak output mengikuti aturan ini:

  • Pada saat itu t=n seconds, nkarakter pertama yang dicetak adalah nkarakter pertama dari string input.
  • Setelah nkarakter tetap, Anda harus menambahkan string yang membentuk karakter acak (dipilih pseudo-acak secara acak dari rentang unicode   ke ~(kode 32 hingga 126)) untuk membentuk string dengan panjang karakter awal.
  • Anda harus menghasilkan setidaknya (lebih lanjut tentang itu nanti) 20 baris setiap detik: masing-masing dari mereka akan memiliki nkarakter pertama yang sama , tetapi ujung acak yang berbeda.

Mungkin belum terlalu jelas apa yang harus Anda lakukan, jadi mari kita lihat sebuah contoh:

Contoh

Saya hanya akan mencetak 5 baris berbeda untuk setiap detik, bukan 20 minimum hanya untuk membuatnya lebih mudah dibaca.

Pertimbangkan inputnya abcde.
Selama detik pertama, output yang valid dapat berupa (benar-benar acak):

dGuT4
S!jkN
"gQ>[
TU3! 
*fAjV

Kemudian, t=1karakter pertama dari setiap string berikut adalah a(karakter pertama dari input):

a);jD
aHv^p
aqw5*
a|.?:
a{gbK

Sekarang,, t=2dua karakter pertama adalah ab:

abTJ"
ab\ e
ab3T#
abYWS
ab"#<

Sekarang, t=3tiga karakter pertama adalah abc:

abcvW
abc3G
abc(g
abc{@
abc@4

Sekarang,, t=4empat karakter pertama adalah abcd:

abcdD
abcdv
abcdj
abcd$
abcd6

Akhirnya, t=5kami mencetak input (hanya sekali):

abcde

Beberapa persiapan

  • Anda tidak perlu terlalu repot dengan ketepatan bahasa Anda terhadap detik (mis. Jika algoritme Anda benar tetapi sistem / bahasa Anda kurang presisi maka tidak masalah).
  • Detik pertama bisa lebih pendek dari satu detik (Yaitu, jika Anda meluncurkan program Anda selama satu detik, detik pertama dapat menjadi waktu yang tersisa hingga akhir detik saat ini). Atau dengan kata lain, Anda tidak perlu menunggu dimulainya detik baru untuk mulai mencetak hasilnya.
  • Setidaknya 20 baris per detik : Cara yang lebih alami akan menjadi loop tanpa batas dengan perilaku khusus setiap detik (atau batas waktu, atau apa pun), sehingga mungkin menghasilkan beberapa ribu baris per detik (dan itu tidak apa-apa! ). Tetapi jika Anda memiliki ide lain, silakan menggunakannya selama Anda mencetak setidaknya 20 baris per detik.
  • Input akan selalu lebih dari 2 karakter.
  • Anda dapat mempertimbangkan bahwa input tidak akan lebih dari 30 karakter jika itu membantu. (Tetapi jika itu bekerja untuk yang lebih lama, itu untuk yang terbaik)
  • Format input harus merupakan representasi string yang paling alami dalam bahasa Anda.
  • Anda diizinkan untuk mencetak baris tambahan.

Contoh kode

Jika Anda masih tidak mengerti apa yang harus Anda lakukan, Anda dapat menjalankan kode berikut di terminal linux untuk melihat:

perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"

Kriteria menang

Ini adalah , jadi kode terpendek dalam byte menang!


Terima kasih kepada Laikoni dan Flp.Tkc untuk saran dan peningkatan mereka di kotak pasir.

Dada
sumber
1
Apakah wajib untuk memisahkan garis output dengan \r(membuat mereka semua saling menggantikan pada layar seperti dalam animasi), atau \ndapat diterima?
1
@ ais523 \nsangat bisa diterima. Versi dengan \rhanya ada di sini karena terlihat lebih baik, tetapi Anda tidak memerlukannya \r.
Dada
Jika generasi acak terjadi untuk memecahkan kata sandi sebelumnya, apakah boleh berhenti pada saat itu?
Jonathan Allan
3
Bukankah seharusnya Anda memasukkan dalam aturan bahwa karakter acak tidak boleh menjadi karakter aktual di tempat itu ? Kalau tidak, string acak bisa cocok dengan kata sandi yang diberikan, tetapi pencarian terus berjalan, yang penggemar film akan menilai sebagai kesalahan.
Tom

Jawaban:

3

Pyth - 27 24 byte

Ini sebenarnya terlihat sangat keren: D

WJ-lQKs.d1+<QKsmOr;\~J;Q

Cobalah online di sini (jelas tidak secara real time, tetapi jika Anda gulir ke bawah dengan tangan yang mantap).

Maltysen
sumber
29

HTML / JavaScript, 170 168 167 byte

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>

Sunting: Disimpan 2 byte berkat @ETHproductions. Disimpan 1 byte berkat @jrich.

Neil
sumber
Belum menguji ini, tetapi saya percaya setIntervalakan menerima string untuk dievaluasi, yang berpotensi menghemat satu byte? setInterval('o.textContent...',d=50)menyimpan _=>dan menambahkan sepasang tanda kutip
jrich
@ jrich Itu berguna, karena saya lupa memperbarui jumlah byte saya!
Neil
20

Node, 145 142 byte

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

Ini sepertinya agak lama, dan mungkin ada sedikit ruang untuk bermain golf. Perhatikan bahwa tanda titik koma di bagian akhir diperlukan; tanpa itu program melempar kesalahan sintaksis karena forpernyataan tidak memiliki tubuh.

Output jauh lebih dari 20 baris per detik; seekor burung kecil memberi tahu saya bahwa sekitar 12 ribu. Berikut tampilannya di emulator terminal ConEmu di komputer saya (direkam pada 30 fps):

masukkan deskripsi gambar di sini

Produksi ETH
sumber
10

05AB1E , 26 byte

Saya memposting ini sebagai jawaban yang berbeda sehubungan dengan jawaban 05AB1E lainnya karena pendekatannya berbeda

.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

Cobalah online!

Osable
sumber
Jawaban yang bagus, +1 dari saya! CATATAN: Ini bisa 22 byte dengan builtin yang lebih baru hari ini: ηbukannya .p; õš(di mana šprepend as list) alih-alih õ¸ì(di mana ¸ìwrap in list, dan prepend); (di mana 26 jika tidak ada input kedua diberikan) alih-alih (yaitu push 10, dan double); ]bukannya }}(di mana ]menutup semua loop, pernyataan if-else, dll. pada saat yang sama)
Kevin Cruijssen
8

BASH, 99 93 92 91 88 byte

dengan tr+ head+urandom

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

(thx. ke @manatwork)

Ipor Sircer
sumber
5
[ "$n" = ${#1} ]((n==${#1})); ${1:0:$n}${1::n}
manatwork
@manatwork: whoa!
Ipor Sircer
1
1 lebih: ruang di depan pengalihan input <tidak diperlukan.
manatwork
1
@manatwork ((n==${#1}))->((${#1}-n))
Ipor Sircer
1
Entah karena Anda membalikkan logika atau karena saya menggedor tes saya sebelumnya, tetapi ${1::n=SECONDS}tampaknya berfungsi sekarang.
manatwork
7

05AB1E, 30 byte

gFžcUNV[¹Y£žQ.r¹gY-£J,XžcÊ#}¹,

Menggunakan pengkodean CP-1252 . Cobalah online!

Tolong bantu saya bermain golf ini.

Oliver Ni
sumber
6

C, 182 176 128 126 125 byte

Golf:

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

Tidak Disatukan:

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

Saya pernah mendengar bahwa ada kemungkinan untuk menjatuhkan beberapa standar #include, tetapi saya tidak dapat membuatnya bekerja pada kompiler MingW GCC yang baru saja saya unduh. Juga tidak tahu bagaimana caranya #define b #includetanpa menggunakan lebih banyak ruang dari yang seharusnya. Saya hanya seorang idiot, itu berfungsi dengan baik tanpa mereka.

nmjcman101
sumber
X = 0 tidak diperlukan sebagai gantinya menyatakannya dengan yang lain seperti ini karena a,b,c,d;semua variabel global menyatakan seperti itu int dan init oleh 0 juga karena Anda tidak mengembalikan apa pun Anda harus menuliskannya di main ()
Mukul Kumar
1
Terima kasih, saya tidak tahu tentang inisialisasi cakupan statis. Saya mendeklarasikan mereka seperti itu, hanya dengan titik koma bukan koma. Juga saya tidak menggunakan main karena saya pikir saya harus mengambil (int argc, char ** argv) dan itu satu ton byte. Saya harap meninggalkannya sebagai fungsi OK, meskipun dibutuhkan input sebagai parameter dan output ke stdout yang sedikit aneh.
nmjcman101
1
Gunakan while(i++<x) sebagai gantifor (...)
Mukul Kumar
Ide yang sangat bagus, tetapi iharus nol setiap kali for loop berjalan lagi.
nmjcman101
Kemudian di forganti yang sama i <xdengan i++<xdan menghapusi++
Mukul Kumar
5

Java 7, 271 265 207 byte

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 byte disimpan berkat @ OliverGrégoire . ( Jangan lupa untuk membatalkan jawaban Java 8 yang lebih pendek. )

Tidak Disatukan:

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

Input: abcde
Keluaran:

masukkan deskripsi gambar di sini

Kevin Cruijssen
sumber
Saya tidak yakin apakah Anda sengaja mendesain hanya mencetak 20 baris per detik, tetapi jika itu membantu golf Anda, Anda hanya perlu mencetak setidaknya 20 baris per detik. Saya tidak tahu apakah mengubah matematika "20 baris per detik" menjadi "mengubah setiap detik" akan membantu atau tidak.
nmjcman101
Anda tidak perlu x: r+=(char)(33+Math.random()*94). Juga Thread.sleep(9)untuk menyimpan byte.
Olivier Grégoire
1
Juga, r=s.substring(0,i/20)alih-alih loop aktif j.
Olivier Grégoire
Mengingat perubahan signifikan yang saya buat, saya memutuskan untuk mengirim jawaban saya dengan komentar-komentar itu. Juga, ini adalah solusi Java 8 yang cukup rendah dalam hitungan byte (Java-wise, ofc).
Olivier Grégoire
@ OlivierGrégoire Terima kasih. Dan saya telah mengangkat jawaban Anda. Saya belum melakukan semua perubahan, hanya r.substring(0,i/20)(yang bodoh saya), dan (char)(33+Math.random()*94)(trik yang bagus dari Anda).
Kevin Cruijssen
4

WinDbg, 400 391 byte

.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 byte dengan menyederhanakan beberapa matematika

Ini jelas bukan jenis hal yang ingin dilakukan WinDbg. ;)

Input diambil dengan memasukkan string ascii di lokasi memori dan mengatur alamat itu ke register semu $t0. Misalnya:

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

Prng yang saya gunakan adalah apa pun isi dalam memori, beberapa byte melewati string input. Chrome.exe muncul untuk mengisi ruang memori setelah 0x2000000dengan byte yang tampak cukup acak jadi saya menggunakan dump chrome.exe. Tidak diketahui apakah ini seragam, tetapi terlihat cukup acak bagi saya.

Bagaimana itu bekerja:

.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

Catatan: Beberapa byte bisa di-golf dengan menggunakan jalih-alih .if, tapi itu menyebabkannya berjalan terlalu lambat di mesin saya sehingga tidak menghasilkan setidaknya 20 baris per detik, jadi jangan menyimpan byte itu.

Contoh Output: http://pastebin.com/H4H74sAx

susu
sumber
4

R, 138 byte

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

Membaca input dari stdin.

Menghitung sekitar 61 baris di mesin saya antara setiap huruf tambahan di "kata sandi".

Billywob
sumber
4

Bash, 247 245 212 207 byte

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"

Terima kasih banyak Bash karena begitu sensitif terhadap ruang ...

Bagaimanapun, output diberikan secara real time pada jalur yang berbeda. Simpan sebagai .shskrip dan aktifkan dengan:

bash <File Name>.sh <Input>

Misalnya, bash Cracking_In_Progress.sh okayertymenghasilkan output berikut, yang direkam pada 30 frame per detik:

Contoh Output

R. Kap
sumber
4

Haskell (GHC), 202 byte

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 byte tanpa aksi pengembalian carriage mewah

masukkan deskripsi gambar di sini

Angs
sumber
Kelihatan bagus! Tapi apa yang >dilakukan di akhir output?
Tiang
3
@ Cepat itulah promptnya. Karena kode tidak mencetak baris baru di bagian akhir, prompt muncul di sana.
Angs
4

MATL , 26 byte

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

Cobalah online!

Di bawah ini adalah output real-time dari kompiler offline. Perhatikan bahwa GIF animasi direkam pada 20 fps agar ukurannya kecil, tetapi kecepatan sebenarnya jauh lebih besar.

masukkan deskripsi gambar di sini

Bagaimana itu bekerja

           % 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
Luis Mendo
sumber
2
Kode ini sangat bahagia. :)
sethmlarson
@SethMichaelLarson Itu karena tanda kutipnya seimbang, yang biasanya tidak terjadi :-)
Luis Mendo
3

Python3, 149 141 139 byte

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

Masukan dari stdin.

Versi mata (157 byte):

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)
matsjoyce
sumber
1
Saya pikir Anda dapat menyimpan beberapa byte dengan tidak "mengubah nama" hal-hal yang hanya Anda lakukan sekali. Misalnya Anda punya t=time.clock, tetapi Anda hanya menggunakan t satu kali dalam kode. Menggantinya dengan hanya time.clockakan menghemat 3 byte. Hal yang sama untuk dicetak.
nmjcman101
@ nmjcman101 Ups, bawa alih dari sebelumnya. Terima kasih!
matsjoyce
Anda for _ in range(l-x)juga bisa for _ in"a"*(l-x)untuk 2 byte.
nmjcman101
@ nmjcman101 Bagus! Aku harus ingat yang itu ...
matsjoyce
Coba print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))alih-alihprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
x1Mike7x
3

Node.js, 134 byte

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

Mirip dengan @ETHproductions (meminjam beberapa optimasinya), tetapi sebaliknya menggunakan pendekatan yang berbeda. Menggunakan Node's Bufferuntuk menangani pembuatan karakter alih-alih panjang String.fromCharCode, yang memiliki manfaat tambahan yaitu membiarkan kita menggunakan maptanpa banyak string-> array-> overhead string conversion.

Mwr247
sumber
Bagus, saya harus belajar lebih banyak tentang Buffer. Asal tahu saja, menugaskan kembali Dateuntuk Dtidak menyimpan byte; Saya mencobanya sendiri.
ETHproduksi
3

Python 3, 167 166 byte

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)

Membaca input dari stdin. Versi 171-byte berjalan di bawah Python 2 (diganti inputdengan 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)

Tidak Disatukan:

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)
Pecahkan Semuanya denganiththon
sumber
3

Dyalog APL , 59 58 byte

Larutan

Membutuhkan ⎕IO←0yang default pada banyak sistem.

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

Tampilan

Dengan menyesuaikan jendela menjadi dua garis, kita mendapatkan ilusi transformasi di tempat:
Animasi kode crack Dyalog APL

Penjelasan

Ini adalah fungsi kereta anonim yang mengambil kata sandi sebagai argumen yang benar.

⊢⊣ mengembalikan kata sandi dan mengabaikan hasil

≢{... fungsi di bawah ini, dengan panjang kata sandi sebagai argumen kiri, diterapkan untuk masing-masing

2⊃⎕AIwaktu saat ini (lit. elemen ketiga dari informasi A ccount I )

1E3+ tambahkan sebentar

t←tetapkan itu ke t

abaikan itu

⍵{... }⍣{t≤2⊃⎕AI}⍺terapkan fungsi berikut (dengan sub-string sebagai dan panjang kata sandi sebagai ) berulang kali hingga waktu habis mencapai t

  ⍵⍴95 95 diulang sebanyak karakter dalam kata sandi

  ? bilangan bulat acak 0 ... 94

  32+tambahkan 32 (sehingga menghasilkan bilangan bulat acak di kisaran 32 ... 126)

  ⎕UCS dikonversi ke karakter Unicode

  ⍺, tambahkan sub-string yang saat ini diproses

  ⍵↑ ambil hanya karakter sebanyak yang ada di kata sandi

  ⎕← output yang di jalur terpisah

   mengembalikan panjang string yang dihasilkan (= panjang kata sandi)

⍳∘≢ 0 ... panjang-1

↑¨masing-masing mengambil karakter dari

kata sandi

Adm
sumber
2

Java, 159 byte

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

Algoritma yang sama dengan jawaban Kevin Cruijssen , hanya benar-benar dioptimalkan untuk Java 8.

Tidak Disatukan:

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");
  }
}
Olivier Grégoire
sumber
1

C #, 203 197 195 190 byte

Golf:

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

Tidak Disatukan:

    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 menyimpan panjang input.

StopWatchdan Path.GetRandomFileName()merupakan bagian dari .NET framework.

EDIT1: StopwatchDeklarasi implisit .

EDIT2: linisialisasi digabung dengan deklarasi.

EDIT3: Terima kasih, @ Chris.

paldir
sumber
Anda dapat menggunakan metode statis Stopwatch.StartNew () untuk menyimpan yang baru di stopwatch, dan memulainya secara eksplisit
Chris
@ Chris, saya tidak tahu tentang metode itu, thx.
paldir
t++dapat dimasukkan di suatu tempat diif ()
Mukul Kumar
@MukulKumar Bisakah Anda memberikan detail lebih lanjut?
paldir
Gunakan if (w.Elapsed.Seconds > t++)dan hapust++;
Mukul Kumar
1

Scala, 259 254 248 233 232 231 227 225 byte

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

Tidak Disatukan:

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)
}
Bersabun
sumber
1

ForceLang , 322 309 byte

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
SuperJedi224
sumber
Bisakah Anda menambahkan tautan untuk bahasa pemrograman yang Anda gunakan?
Solomon Ucko
@SolomonUcko Ini dia.
SuperJedi224
1

C ++ (gcc) , 280 278 byte

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

Cobalah online!

Ini hanya mencetak 20 string acak menunggu 50 std::chrono::millisecondsantara satu sama lain (sehingga menghasilkan tepat 20 baris per detik) dan kemudian melanjutkan ke langkah "cracking" berikutnya.

Max Yekhlakov
sumber
1

Pergi , 244 byte

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

Cobalah online!(Memotong hasilnya sehingga tidak menunjukkan setiap contoh)

Ini adalah jawaban Golang pertamaku \ o /

masukkan deskripsi gambar di sini

(Difilmkan @ 30fps)

Bagaimana:

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
}
J. Sallé
sumber
0

PHP, 222 byte

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

Tidak disatukan

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

(saya tahu videonya omong kosong) masukkan deskripsi gambar di sini

Nino Škopac
sumber
Ini bisa bermain golf lebih banyak. Misalnya, alih-alih $c=range(32,127)kemudian $r=chr($c[rand(0,94)]), mengapa tidak adil $r=chr(rand(0,94)+32)?
Xanderhall
Poin bagus. Ini golf pertama saya: 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";}adalah 149 byte, dan saya yakin itu bisa
bermain golf
Keren, Anda harus memposting pria itu.
Nino Škopac
Cukup edit jawaban Anda, Anda diizinkan untuk mengubah dan memperbaikinya.
Xanderhall
0

Tcl , 295 byte

Golf pertama untuk saya di Tcl. Bukan bahasa yang sangat golf, karena semuanya diperlakukan sebagai string di sini sehingga spasi putih biasanya harus ...

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

Tidak Disatukan:

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
hdrz
sumber
Mengapa Anda tidak menyimpan output pada variabel kemudian bergabung dengan mereka semua, untuk menghindari -nonewlinepada putsparameter?
sergiol
Saya pikir Anda tidak membutuhkan keduanya exprpada akhirnya; satu sudah cukup, dan Anda juga dapat menghindari ruang di sekitar >
sergiol
Terima kasih @sergiol, Tidak ada spasi di sekitar>, lihat versi kental. Mohon saran bagaimana cara menggunakannya exprdi akhir, saya tidak bisa melihatnya.
hdrz
demo dari dua saran saya.
sergiol
1
[set k [expr $k-1]]bisa [incr k -1]. Dan setiap `<` bisa <, tanpa spasi.
sergiol
0

Kotlin, 188 byte

Golf

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)

Tidak disatukan

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)

masukkan deskripsi gambar di sini

Mengganti nama System.currentTimeMillismenyimpan beberapa byte!

Tyler MacDonell
sumber
0

QBIC , 92 88 byte

Saya sudah memecahkannya!

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

Ini bergantung pada fungsi SLEEP QBasic menggunakan kode literal $sleep 1| , dan pada QBasicLEFT$ fungsi karena saya belum mengimplementasikan fungsi itu di QBIC ...

Berhasil mengikis beberapa byte dengan mengganti semua 20 untukt dan menetapkan ke 20. Juga, merampingkan panggilan ke acak dan loop UNTUK.

Penjelasan:

' 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

Output (sepotong bagian tengah di '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 
steenbergh
sumber