Đang rạn nứt


57

Hãy nhớ những chương trình vũ phu để bẻ khóa mật khẩu hiển thị mọi kết hợp họ đang thử? Chính xác hơn, tại một thời điểm, n ký tự đầu tiên được cố định (chúng đã được đoán thành công) và mọi ký tự có thể cho các ký tự còn lại đang được thử nghiệm. Bạn có thể đã thấy một số trong phim hoặc trong một số phần mềm được viết bởi những người thích giao diện ưa thích.
Xin lỗi vì đã làm chúng tôi thất vọng, nhưng chúng tôi sẽ không viết chương trình bẻ khóa mật khẩu, chỉ có một chương trình để tạo lại đầu ra đẹp.

Thử thách

Đưa ra một chuỗi chứa các ký tự ascii có thể in nhưng không có dòng mới (mã ascii 32 đến 126 hoặc khớp với biểu thức chính quy ^[ -~]{2,}$), in một đầu ra theo quy tắc này:

  • Tại thời điểm t=n seconds, các nký tự đầu tiên được in là các nký tự đầu tiên của chuỗi đầu vào.
  • Sau các nký tự cố định, bạn nên nối thêm một chuỗi ký tự ngẫu nhiên (được chọn ngẫu nhiên giả ngẫu nhiên từ phạm vi unicode   thành ~(mã 32 đến 126)) để tạo thành một chuỗi có độ dài của chuỗi ban đầu.
  • Bạn nên xuất ít nhất (nhiều hơn về sau) 20 dòng mỗi giây: mỗi dòng sẽ có cùng một nký tự đầu tiên, nhưng một kết thúc ngẫu nhiên khác nhau.

Có lẽ bạn chưa rõ lắm về những gì bạn phải làm, vì vậy hãy xem qua một ví dụ:

Thí dụ

Tôi sẽ chỉ in 5 dòng khác nhau cho mỗi giây thay vì tối thiểu 20 dòng chỉ để dễ đọc hơn.

Hãy xem xét đầu vào abcde.
Trong giây đầu tiên, một đầu ra hợp lệ có thể giống như (hoàn toàn ngẫu nhiên):

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

Sau đó, t=1ký tự đầu tiên của mỗi chuỗi sau sẽ là a(ký tự đầu tiên của đầu vào):

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

Bây giờ, t=2hai ký tự đầu tiên sẽ là ab:

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

Bây giờ, t=3ba ký tự đầu tiên sẽ là abc:

abcvW
abc3G
abc(g
abc{@
abc@4

Bây giờ, t=4bốn ký tự đầu tiên sẽ là abcd:

abcdD
abcdv
abcdj
abcd$
abcd6

Cuối cùng, t=5chúng tôi in đầu vào (chỉ một lần):

abcde

Một vài giới hạn

  • Bạn không nên bận tâm quá nhiều đến độ chính xác ngôn ngữ của mình trong vài giây (ví dụ: Nếu thuật toán của bạn đúng nhưng hệ thống / ngôn ngữ của bạn thiếu độ chính xác thì không sao).
  • Giây đầu tiên có thể ngắn hơn một giây (Nghĩa là, nếu bạn khởi chạy chương trình của mình trong một giây, giây đầu tiên có thể chỉ là thời gian còn lại cho đến hết giây hiện tại). Hoặc đặt khác đi, bạn không phải đợi bắt đầu một giây mới để bắt đầu in các đầu ra.
  • Ít nhất 20 dòng mỗi giây : Cách tự nhiên hơn sẽ là một vòng lặp vô hạn với một hành vi đặc biệt mỗi giây (hoặc hết thời gian, hoặc bất cứ điều gì), do đó sẽ dẫn đến vài nghìn dòng mỗi giây (và điều đó hoàn toàn ổn! ). Nhưng nếu bạn có một ý tưởng khác, hãy sử dụng nó miễn là bạn in ít nhất 20 dòng mỗi giây.
  • Đầu vào sẽ luôn dài hơn 2 ký tự.
  • Bạn có thể xem xét rằng đầu vào sẽ không dài hơn 30 ký tự nếu nó giúp. (Nhưng nếu nó hoạt động cho những cái dài hơn, thì nó là tốt nhất)
  • Định dạng đầu vào phải là đại diện tự nhiên nhất của một chuỗi trong ngôn ngữ của bạn.
  • Bạn được phép in một dòng mới.

Mã ví dụ

Nếu bạn vẫn không hiểu chính xác những gì bạn phải làm, bạn có thể chạy đoạn mã sau trong thiết bị đầu cuối linux để xem:

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

Tiêu chí chiến thắng

Đây là , vì vậy mã ngắn nhất trong byte thắng!


Cảm ơn Laikoni và Flp.Tkc vì những gợi ý và cải tiến của họ trong hộp cát.



1
Có bắt buộc phải phân tách các dòng đầu ra với \r(làm cho tất cả chúng thay thế nhau trên màn hình như trong hoạt hình), hoặc được \nchấp nhận không?

1
@ ais523 \nlà hoàn toàn chấp nhận được. Phiên bản với \rchỉ ở đây vì nó trông đẹp hơn, nhưng bạn không cần những thứ đó \r.
Dada

Nếu việc tạo ngẫu nhiên xảy ra để bẻ khóa mật khẩu sớm hơn thì có dừng lại ở điểm đó không?
Jonathan Allan

3
Bạn không nên bao gồm trong các quy tắc rằng các nhân vật ngẫu nhiên không nên là nhân vật thực tế ở nơi đó ? Mặt khác, các chuỗi ngẫu nhiên có thể khớp với mật khẩu đã cho, nhưng quá trình tìm kiếm vẫn tiếp tục, những người xem phim sẽ đánh giá là trục trặc.
Tom

Câu trả lời:


3

Pyth - 27 24 byte

Điều này thực sự trông khá tuyệt: D

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

Hãy thử trực tuyến tại đây (rõ ràng không phải trong thời gian thực, nhưng nếu bạn cuộn nó xuống với một bàn tay ổn định).


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>

Chỉnh sửa: Đã lưu 2 byte nhờ @ETHproductions. Đã lưu 1 byte nhờ @jrich.


Chưa thử nghiệm điều này, nhưng tôi tin rằng setIntervalsẽ chấp nhận một chuỗi được đánh giá, có khả năng tiết kiệm một byte? setInterval('o.textContent...',d=50)tiết kiệm _=>và cho biết thêm một cặp dấu ngoặc kép
jrich

@jrich Điều đó thật tiện lợi, vì tôi đã quên cập nhật số byte của mình!
Neil

20

Nút, 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))););

Cái này có vẻ hơi dài và có lẽ có một ít chỗ để chơi gôn. Lưu ý rằng dấu chấm phẩy ở cuối là bắt buộc; không có nó, chương trình sẽ đưa ra một lỗi cú pháp vì forcâu lệnh không có phần thân.

Đầu ra cách hơn 20 dòng mỗi giây; một chú chim nhỏ nói với tôi rằng đó là khoảng 12 nghìn. Đây là giao diện của trình giả lập thiết bị đầu cuối ConEmu trên máy tính của tôi (được ghi ở 30 khung hình / giây):

nhập mô tả hình ảnh ở đây


10

05AB1E , 26 byte

Tôi đăng bài này dưới dạng câu trả lời khác đối với câu trả lời 05AB1E khác vì cách tiếp cận khác

.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

Hãy thử trực tuyến!


Câu trả lời hay, +1 từ tôi! LƯU Ý: Nó có thể là 22 byte với các nội dung mới hơn ngày nay: ηthay vì .p; õš(nơi šđược thêm vào dưới dạng danh sách) thay vì õ¸ì(nơi ¸ìđược bao bọc trong danh sách và trả trước); (trong đó là 26 nếu không có đầu vào thứ hai nào được đưa ra) thay vì (được đẩy 10 và gấp đôi); ]thay vì }}(nơi ]đóng tất cả các vòng lặp, câu lệnh if-
other

8

BASH, 99 93 92 91 88 byte

với tr+ head+urandom

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

(thx. đến @manatwork)


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

@manatwork: whoa!
Ipor Sircer

1
Thêm 1: không gian phía trước chuyển hướng đầu vào <là không cần thiết.
manatwork

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

1
Hoặc là do bạn đảo ngược logic hoặc vì tôi đã vượt qua bài kiểm tra trước đây của mình, nhưng ${1::n=SECONDS}dường như bây giờ vẫn hoạt động.
manatwork


6

C, 182 176 128 126 125 byte

Chơi gôn

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

Ung dung:

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

Tôi đã nghe nói rằng có thể bỏ một số #includes tiêu chuẩn , nhưng tôi không thể làm cho nó hoạt động trên trình biên dịch MingW GCC mà tôi vừa tải xuống. Cũng không thể tìm ra cách để #define b #includekhông sử dụng nhiều không gian hơn giá trị của nó. Tôi chỉ là một thằng ngốc, nó hoạt động tốt mà không có họ.


X = 0 là không bắt buộc thay vì khai báo nó với những người khác như thế này a,b,c,d;vì tất cả các biến toàn cục được khai báo là int và init bằng 0 vì bạn không trả lại gì, bạn nên viết nó vào main ()
Mukul Kumar

1
Cảm ơn, tôi không biết về khởi tạo phạm vi tĩnh. Tôi đã tuyên bố chúng như thế, chỉ với dấu chấm phẩy thay vì dấu phẩy. Ngoài ra tôi đã không sử dụng chính vì tôi nghĩ sau đó tôi cần phải lấy (int argc, char ** argv) và đó là một tấn byte. Tôi hy vọng để lại nó như là một chức năng là OK, mặc dù nó lấy đầu vào là một tham số và đầu ra thành thiết bị xuất chuẩn hơi kỳ quặc.
nmjcman101

1
Sử dụng while(i++<x) thay vìfor (...)
Mukul Kumar

Ý tưởng thực sự tốt, nhưng icần phải bằng không mỗi khi vòng lặp for chạy lại.
nmjcman101

Sau đó, trong cùng một forthay thế i <xvới i++<xvà loại bỏi++
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 được lưu nhờ @ OliverGrégoire . ( Đừng quên nâng cấp câu trả lời Java 8 thậm chí ngắn hơn của anh ấy. )

Ung dung:

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

Đầu vào: abcde
Đầu ra:

nhập mô tả hình ảnh ở đây


Tôi không chắc chắn nếu bạn thiết kế nó một cách có chủ đích chỉ in 20 dòng mỗi giây, nhưng nếu nó giúp bạn chơi golf, bạn chỉ phải in ít nhất 20 dòng mỗi giây. Tôi không biết việc thay đổi toán học "20 dòng mỗi giây" thành toán học "thay đổi mỗi giây" sẽ giúp ích hay không.
nmjcman101

Bạn không cần x: r+=(char)(33+Math.random()*94). Ngoài ra Thread.sleep(9)để tiết kiệm một byte.
Olivier Grégoire

1
Ngoài ra, r=s.substring(0,i/20)thay vì vòng lặp trên j.
Olivier Grégoire

Với những thay đổi đáng kể mà tôi đã thực hiện, tôi quyết định đăng câu trả lời của mình với những bình luận được đưa vào tài khoản. Ngoài ra, đây là một giải pháp Java 8 có số lượng byte khá thấp (Java-khôn ngoan, ofc).
Olivier Grégoire

@ OlivierGrégoire Cảm ơn. Và tôi đã nâng cao câu trả lời của bạn. Tôi đã không thực hiện tất cả các thay đổi, chỉ có r.substring(0,i/20)(khá ngu ngốc đối với tôi) và (char)(33+Math.random()*94)(mẹo hay từ bạn).
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 bằng cách đơn giản hóa một số phép toán

Đây chắc chắn không phải là điều WinDbg dự định làm. ;)

Đầu vào được lấy bằng cách nhập chuỗi ascii tại một vị trí bộ nhớ và đặt địa chỉ đó thành thanh ghi giả $t0. Ví dụ:

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

Prng tôi đang sử dụng là bất cứ nội dung nào trong bộ nhớ, một số byte vượt qua chuỗi đầu vào. Chrome.exe dường như lấp đầy không gian bộ nhớ sau 0x2000000với các byte đủ tìm kiếm ngẫu nhiên nên tôi đã sử dụng kết xuất chrome.exe. Không biết đây có phải là đồng phục không, nhưng có vẻ ngẫu nhiên - đủ với tôi.

Làm thế nào nó hoạt động:

.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

Lưu ý: Một số byte có thể được đánh gôn bằng cách sử dụng jthay vì .if', nhưng điều đó khiến nó chạy quá chậm trên máy của tôi để nó không xuất ra ít nhất 20 dòng mỗi giây, do đó không lưu các byte đó.

Đầu ra mẫu: http://pastebin.com/H4H74sAx


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

Đọc đầu vào từ stdin.

Đã đếm khoảng 61 dòng trên máy của tôi giữa mỗi chữ cái bổ sung trong "mật khẩu".


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"

Cảm ơn rất nhiều Bash vì đã rất nhạy cảm với khoảng trắng ...

Dù sao, đầu ra được đưa ra trong thời gian thực trên các dòng riêng biệt. Lưu dưới dạng .shtập lệnh và gọi với:

bash <File Name>.sh <Input>

Ví dụ: bash Cracking_In_Progress.sh okayertykết quả trong đầu ra sau, được ghi ở 30 khung hình mỗi giây:

Ví dụ đầu ra


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 mà không có hành động trả lại vận chuyển ưa thích

nhập mô tả hình ảnh ở đây


Có vẻ tốt! Nhưng những gì >đang làm ở cuối đầu ra?
Mast

3
@Mast đó là lời nhắc. Vì mã không in một dòng mới ở cuối, lời nhắc đến đó.
Angs

4

MATL , 26 byte

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

Hãy thử trực tuyến!

Dưới đây là đầu ra thời gian thực từ trình biên dịch ngoại tuyến. Lưu ý rằng GIF hoạt hình được ghi ở tốc độ 20 khung hình / giây để giữ kích thước nhỏ, nhưng tốc độ thực tế lớn hơn nhiều.

nhập mô tả hình ảnh ở đây

Làm thế nào nó hoạt động

           % 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
Mã này rất hạnh phúc. :)
sethmlarson

@SethMichaelLarson Đó là vì dấu ngoặc kép của nó được cân bằng, điều này thường không xảy ra :-)
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)))

Đầu vào từ stdin.

Phiên bản mắt (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)

1
Tôi nghĩ bạn có thể lưu một vài byte bằng cách không "đổi tên" những thứ mà bạn chỉ làm một lần. Ví dụ bạn có t=time.clock, nhưng bạn chỉ sử dụng t một lần trong mã. Thay thế nó chỉ time.clocksẽ tiết kiệm 3 byte. Điều tương tự cho in ấn.
nmjcman101

@ nmjcman101 Rất tiếc, mang từ ver trước. Cảm ơn!
matjoyce

Ngoài ra, bạn for _ in range(l-x)có thể for _ in"a"*(l-x)cho 2 byte.
nmjcman101

@ nmjcman101 Đẹp quá! Tôi phải nhớ rằng một ...
matjoyce

Hãy thử print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))thay vìprint(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``););

Tương tự như @ETHproductions (mượn một số tối ưu hóa của anh ấy), nhưng mặt khác lại có một cách tiếp cận khác. Sử dụng Node Bufferđể xử lý việc tạo ký tự thay vì dài String.fromCharCode, có lợi ích phụ là cho phép chúng tôi sử dụng mapmà không cần nhiều chuỗi-> mảng-> phí chuyển đổi chuỗi.


Đẹp, tôi nên tìm hiểu thêm về Buffer. Chỉ để bạn biết, gán lại Dateđể Dkhông lưu bất kỳ byte nào; Tôi đã thử điều đó bản thân mình.
Sản xuất ETH

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)

Đọc đầu vào từ stdin. Phiên bản 171 byte chạy dưới Python 2 (được thay thế inputbằng 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)

Ung dung:

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 Dyalog , 59 58 byte

Giải pháp

Yêu cầu ⎕IO←0mặc định trên nhiều hệ thống.

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

Trưng bày

Bằng cách điều chỉnh cửa sổ thành hai dòng, chúng ta có được ảo ảnh về một phép biến đổi tại chỗ:
Dyalog APL mã bẻ khóa hoạt hình

Giải trình

Đây là một hàm đào tạo hàm ẩn danh lấy mật khẩu làm đối số đúng.

⊢⊣ trả lại mật khẩu và loại bỏ kết quả của

≢{... hàm bên dưới, với độ dài của mật khẩu là đối số bên trái, được áp dụng cho từng

2⊃⎕AIthời gian hiện tại (phần tử thứ ba của thông tin A ccount I )

1E3+ thêm một giây

t←gán nó cho t

gạt bỏ điều đó

⍵{... }⍣{t≤2⊃⎕AI}⍺áp dụng các chức năng sau đây (với phụ chuỗi như và độ dài mật khẩu như ) lặp đi lặp lại cho đến khi thời gian lên đến t

  ⍵⍴95 95 lần lặp lại nhiều lần như có các ký tự trong mật khẩu

  ? số nguyên ngẫu nhiên 0 ... 94

  32+thêm 32 (do đó thu được integ số nguyên ngẫu nhiên trong phạm vi 32 ... 126)

  ⎕UCS chuyển đổi thành ký tự Unicode

  ⍺, thêm vào chuỗi con hiện đang xử lý

  ⍵↑ chỉ lấy nhiều ký tự như trong mật khẩu

  ⎕← đầu ra trên một dòng riêng biệt

   trả về độ dài của chuỗi xuất ra (= độ dài của mật khẩu)

⍳∘≢ 0 ... chiều dài-1

↑¨mỗi nhân vật lấy từ

Mật khẩu


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

Thuật toán tương tự như câu trả lời của Kevin Cruijssen , chỉ được tối ưu hóa hoàn toàn cho Java 8.

Ung dung:

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 byte

Chơi gôn

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

Ung dung:

    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 lưu trữ chiều dài đầu vào.

StopWatchPath.GetRandomFileName()là một phần của .NET framework.

EDIT1: StopwatchKhai báo ngầm .

EDIT2: lkhởi tạo hợp nhất với khai báo.

EDIT3: Cảm ơn, @Chris.


Bạn có thể sử dụng phương thức tĩnh Đồng hồ bấm giờ.StartNew () để lưu mới làm mới đồng hồ bấm giờ và khởi động rõ ràng
Chris

@Chris, tôi không biết về phương pháp đó, thx.
paldir

t++có thể được chèn vào đâu đó trongif ()
Mukul Kumar

@MukulKumar Bạn có thể cung cấp thêm chi tiết không?
paldir

Sử dụng if (w.Elapsed.Seconds > t++)và loại bỏt++;
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)}

Ung dung:

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

Bạn có thể thêm một liên kết cho ngôn ngữ lập trình bạn đã sử dụng?
Solomon Ucko

@SolomonUcko Ở đây bạn đi.
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);}

Hãy thử trực tuyến!

Nó chỉ in 20 chuỗi ngẫu nhiên chờ 50 chuỗi với std::chrono::millisecondsnhau (do đó xuất ra chính xác 20 dòng mỗi giây) và sau đó tiến hành bước "bẻ khóa" tiếp theo.


1

Đi , 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)}

Hãy thử trực tuyến! (cắt ngắn kết quả để nó không hiển thị mọi trường hợp)

Đây là câu trả lời Golang đầu tiên của tôi \ o /

nhập mô tả hình ảnh ở đây

(Quay @ 30 khung hình / giây)

Làm sao:

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

Ung dung

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

(tôi biết video là tào lao) nhập mô tả hình ảnh ở đây


Điều này có thể được chơi golf nhiều hơn nữa. Ví dụ, thay vì $c=range(32,127)và sau đó $r=chr($c[rand(0,94)]), tại sao không chỉ $r=chr(rand(0,94)+32)?
Xanderhall

Điểm tốt. Đây là môn đánh gôn đầu tiên của tôi: 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";}là 149 byte và tôi chắc chắn rằng nó có thể được chơi gôn hơn nữa
Xanderhall

Thật tuyệt, bạn nên đăng người đàn ông đó.
Nino kopac

Chỉ cần chỉnh sửa câu trả lời của bạn, bạn được phép thay đổi và cải thiện nó.
Xanderhall

0

Tcl , 295 byte

Golf đầu tiên cho tôi ở Tcl. Không phải là một ngôn ngữ có thể chơi được, vì mọi thứ được coi là các chuỗi ở đây nên khoảng trắng thường là ...

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

Ung dung:

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

Tại sao bạn không lưu trữ các đầu ra trên một biến sau đó tham gia cùng họ tất cả, để tránh -nonewlinetrên putstham số?
sergiol

Tôi nghĩ rằng bạn không cần hai exprở cuối; một là đủ, và bạn cũng có thể tránh các không gian xung quanh >
sergiol

Cảm ơn @sergiol, không có khoảng trống xung quanh>, hãy xem phiên bản thu gọn. Xin vui lòng tư vấn làm thế nào để sử dụng một exprở cuối, tôi không thể nhìn thấy nó.
hdrz

bản demo của hai gợi ý của tôi.
sergiol

1
[set k [expr $k-1]]có thể [incr k -1]. Và mọi `<` có thể <, không cần khoảng trắng.
sergiol

0

Kotlin, 188 byte

Chơi gôn

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)

Ung dung

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)

nhập mô tả hình ảnh ở đây

Đổi tên System.currentTimeMillisđã lưu khá nhiều byte!


0

QBIC , 92 88 byte

Tôi đã bẻ khóa nó!

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

Điều này phụ thuộc vào chức năng SLEEP của QBasic bằng cách sử dụng mã bằng chữ $sleep 1|và trên LEFT$chức năng của QBasic vì tôi chưa triển khai chức năng đó trong QBIC ...

Được quản lý để cạo một vài byte bằng cách thay thế tất cả 20cho tvà đặt nó thành 20. Ngoài ra, sắp xếp một cuộc gọi thành ngẫu nhiên và một vòng lặp FOR.

Giải trình:

' 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

Đầu ra (một phần của phần giữa trên 'hellowworld')

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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.