กำลังแคร็ก


57

จำโปรแกรมที่กำลังดุร้ายเหล่านั้นที่จะถอดรหัสรหัสผ่านที่แสดงชุดค่าผสมที่พวกเขากำลังพยายามหรือไม่ แม่นยำมากขึ้นเมื่อถึงจุดหนึ่งที่nตัวละครแรกที่ได้รับการแก้ไข (พวกเขาได้รับการคาดเดาที่ประสบความสำเร็จ) และตัวละครทุกตัวที่เป็นไปได้สำหรับคนที่เหลือจะถูกทดสอบ คุณอาจเคยเห็นในภาพยนตร์หรือซอฟต์แวร์ที่เขียนโดยคนที่ชอบอินเทอร์เฟซแฟนซี
ขออภัยที่ทำให้ผิดหวัง แต่เราจะไม่เขียนโปรแกรมเพื่อถอดรหัสรหัสผ่านเพียงอันเดียวเพื่อสร้างผลลัพธ์ที่ดี

ท้าทาย

รับสตริงที่มีอักขระ ASCII ที่พิมพ์ได้ แต่ไม่มีการขึ้นบรรทัดใหม่ (รหัส ASCII 32 ถึง 126 หรือจับคู่ regex ^[ -~]{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

ไม่กี่ precisions

  • คุณไม่ควรกังวลกับความแม่นยำทางภาษาของคุณมากเกินไปในเวลาไม่กี่วินาที (เช่นหากอัลกอริทึมของคุณถูกต้อง แต่ระบบ / ภาษาของคุณไม่มีความแม่นยำ
  • วินาทีแรกสามารถสั้นกว่าหนึ่งวินาที (นั่นคือถ้าคุณเริ่มโปรแกรมในช่วงวินาทีวินาทีแรกอาจเป็นเวลาที่เหลือจนกระทั่งสิ้นสุดวินาทีปัจจุบัน) หรือให้ความแตกต่างคุณไม่ต้องรอให้ถึงวินาทีใหม่เพื่อเริ่มพิมพ์ผลงาน
  • อย่างน้อย 20 บรรทัดต่อวินาที : วิธีที่เป็นธรรมชาติมากขึ้นจะวนซ้ำไม่สิ้นสุดกับพฤติกรรมพิเศษหนึ่งทุกวินาที (หรือหมดเวลาหรืออะไรก็ตาม) ดังนั้นจะส่งผลให้สองสามพันบรรทัดต่อวินาที (และที่ดีอย่างสมบูรณ์! ) แต่ถ้าคุณมีแนวคิดอื่นอย่าลังเลที่จะใช้มันตราบใดที่คุณพิมพ์อย่างน้อย 20 บรรทัดต่อวินาที
  • อินพุตจะมีความยาวเกิน 2 อักขระเสมอ
  • คุณสามารถพิจารณาว่าการป้อนข้อมูลจะไม่เกิน 30 อักขระที่จะช่วยได้ (แต่ถ้ามันใช้งานได้นานกว่ามันจะดีที่สุด)
  • รูปแบบการป้อนข้อมูลควรเป็นตัวแทนที่เป็นธรรมชาติที่สุดของสตริงในภาษาของคุณ
  • คุณได้รับอนุญาตให้พิมพ์บรรทัดใหม่ที่ต่อท้าย

ตัวอย่างรหัส

หากคุณยังไม่เข้าใจสิ่งที่คุณต้องทำคุณสามารถรันโค้ดต่อไปนี้ใน terminal 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มัน
Dada

หากรุ่นสุ่มเกิดขึ้นเพื่อถอดรหัสรหัสผ่านก่อนหน้านี้มันดีไหมที่จะหยุดที่จุดนั้น?
Jonathan Allan

3
คุณไม่ควรรวมอยู่ในกฎที่ว่าตัวอักษรแบบสุ่มไม่ควรจะเป็นตัวละครที่เกิดขึ้นจริงในสถานที่ที่ ? มิฉะนั้นสตริงสุ่มสามารถตรงกับรหัสผ่านที่ให้ไว้ แต่การค้นหาจะดำเนินต่อไปซึ่ง buffs ภาพยนตร์จะให้คะแนนว่าเป็นความผิดพลาด
Tom

คำตอบ:



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จะยอมรับสตริงที่จะถูกประเมินซึ่งอาจจะช่วยประหยัดไบต์ setInterval('o.textContent...',d=50)บันทึก_=>และเพิ่มคู่ของคำพูด
jrich

@ jrich มันมีประโยชน์อย่างที่ฉันลืมที่จะอัปเดตจำนวนไบต์ของฉัน!
Neil

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,000 นี่คือลักษณะที่ปรากฏในเครื่องจำลองเทอร์มินัล ConEmu บนคอมพิวเตอร์ของฉัน (บันทึกที่ 30 fps):

ป้อนคำอธิบายรูปภาพที่นี่


10

05AB1E , 26 ไบต์

ฉันโพสต์สิ่งนี้เป็นคำตอบที่ต่างไปจากคำตอบอื่น ๆ ของ 05AB1E เนื่องจากวิธีการนั้นแตกต่างกัน

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

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

ลองออนไลน์!


คำตอบที่ดี +1 จากฉัน! หมายเหตุ: สามารถมีขนาด 22 ไบต์ด้วยบิวด์อินที่ใหม่กว่าในวันนี้: ηแทนที่จะเป็น.p; õš(โดยที่šprepend เป็นรายการ) แทนที่จะเป็นõ¸ì(โดยที่¸ìwrap ในรายการและ prepend); (ซึ่งคือ 26 ถ้าไม่มีอินพุตที่สองให้) แทน(ซึ่งคือ push 10 และ double); ]แทน}}(ซึ่ง]จะปิดลูปทั้งหมด, คำสั่ง if-else ฯลฯ ในเวลาเดียวกัน)
Kevin Cruijssen

8

BASH, 99 93 92 91 88 ไบต์

ด้วยtr+ head+urandom

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

(ขอบคุณไปยัง @manatwork)


5
[ "$n" = ${#1} ]((n==${#1})); ${1:0:$n}${1::n}
จัดการ

@Manatwork: โอ้โห!
Ipor Sircer

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

Ungolfed:

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

ฉันได้ยินมาว่ามีความเป็นไปได้ที่จะปล่อย#includes มาตรฐานบางตัวแต่ฉันไม่สามารถทำงานกับคอมไพเลอร์ MingW GCC ที่ฉันเพิ่งดาวน์โหลด ยังไม่สามารถคิดออกว่าจะทำอย่างไร#define b #includeหากไม่ใช้พื้นที่มากกว่าที่ควรจะเป็น ฉันเป็นคนงี่เง่า แต่ก็ใช้งานได้ดีถ้าไม่มีพวกมัน


X = 0 ไม่ต้องการแทนประกาศกับคนอื่น ๆ เช่นนี้a,b,c,d;เพราะว่าตัวแปรทั่วโลกทั้งหมดที่ประกาศเช่นนั้นเป็น int และเริ่มต้นด้วย 0 เช่นกันเนื่องจากคุณไม่ได้คืนสิ่งใดเลยคุณควรเขียนไว้ใน main ()
Mukul Kumar

1
ขอบคุณฉันไม่รู้เกี่ยวกับการเริ่มต้นขอบเขตคงที่ ฉันบอกพวกเขาอย่างนั้นแค่ใช้เซมิโคลอนแทนเครื่องหมายจุลภาค นอกจากนี้ฉันไม่ได้ใช้ main เพราะฉันคิดว่าถ้าอย่างนั้นฉันต้องใช้ (int argc, char ** argv) และนั่นคือจำนวนไบต์ ฉันหวังว่าจะปล่อยให้มันเป็นฟังก์ชั่นก็โอเคแม้ว่ามันจะใช้อินพุตเป็นพารามิเตอร์และส่งออกไปยัง stdout ซึ่งแปลกเล็กน้อย
nmjcman101

1
ใช้while(i++<x) แทนfor (...)
Mukul Kumar

ความคิดที่ดีจริงๆ แต่iต้องเป็นศูนย์ทุกครั้งที่ลูปทำงานอีกครั้ง
nmjcman101

จากนั้นในforแทนที่i <xด้วยเหมือนกันi++<xและลบi++
Mukul Kumar

5

Java 7, 271 265 207 ไบต์

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

-58 ไบต์บันทึกขอบคุณที่@ OliverGrégoire ( อย่าลืมโหวต Java 8 สั้น ๆ ของเขาด้วย )

Ungolfed:

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

อินพุต: abcde
เอาต์พุต:

ป้อนคำอธิบายรูปภาพที่นี่


ฉันไม่แน่ใจว่าคุณออกแบบมาเพื่อพิมพ์เพียง 20 บรรทัดต่อวินาทีหรือไม่ แต่ถ้าช่วยคุณตีกอล์ฟคุณต้องพิมพ์อย่างน้อย 20 บรรทัดต่อวินาที ฉันไม่รู้ว่าการเปลี่ยนคณิตศาสตร์ "20 บรรทัดต่อวินาที" เป็น "เปลี่ยนทุกวินาที" คณิตศาสตร์จะช่วยได้หรือไม่
nmjcman101

คุณไม่ต้องการx: r+=(char)(33+Math.random()*94). นอกจากนี้ยังThread.sleep(9)บันทึกไบต์
Olivier Grégoire

1
นอกจากนี้แทนของวงในr=s.substring(0,i/20) j
Olivier Grégoire

จากการเปลี่ยนแปลงที่สำคัญที่ฉันทำฉันตัดสินใจที่จะโพสต์คำตอบของฉันพร้อมกับความคิดเห็นเหล่านั้นในบัญชี นอกจากนี้ยังเป็นวิธีแก้ปัญหา Java 8 ที่ค่อนข้างต่ำในจำนวนไบต์ (Java-wise, ofc)
Olivier Grégoire

@ OlivierGrégoireขอบคุณ และฉันก็ตอบโต้คำตอบของคุณ ฉันยังไม่ได้ทำการเปลี่ยนแปลงทั้งหมดเพียงr.substring(0,i/20)(โง่เขลาของฉัน) และ(char)(33+Math.random()*94)(เคล็ดลับดีจากคุณ)
Kevin Cruijssen

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 นั่นคือพรอมต์ เนื่องจากรหัสไม่พิมพ์บรรทัดใหม่ในตอนท้ายพรอมต์จึงไปที่นั่น
Angs

4

MATL , 26 ไบต์

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

ลองออนไลน์!

ด้านล่างคือเอาต์พุตแบบเรียลไทม์จากคอมไพเลอร์ออฟไลน์ โปรดทราบว่า GIF แบบเคลื่อนไหวถูกบันทึกไว้ที่ 20 fps เพื่อให้ขนาดเล็ก แต่ความเร็วจริงนั้นยิ่งใหญ่กว่ามาก

ป้อนคำอธิบายรูปภาพที่นี่

มันทำงานอย่างไร

           % 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 นั่นเป็นเพราะเครื่องหมายคำพูดของมันมีความสมดุลซึ่งไม่ปกติเกิดขึ้น :-)
หลุยส์ Mendo

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

รุ่น Eyes (157 ไบต์):

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

1
ฉันคิดว่าคุณสามารถบันทึกได้สองสามไบต์โดยไม่ "เปลี่ยนชื่อ" สิ่งที่คุณทำเพียงครั้งเดียว ตัวอย่างเช่นคุณมีt=time.clockแต่คุณใช้เพียงครั้งเดียวในรหัส แทนที่ด้วยเพียงแค่time.clockจะบันทึก 3 ไบต์ สิ่งเดียวกันสำหรับการพิมพ์
nmjcman101

@ nmjcman101 โอ๊ะโออุ้มต่อจากเวอร์ชั่นก่อนหน้า ขอบคุณ!
matsjoyce

นอกจากนี้คุณfor _ in range(l-x)สามารถfor _ in"a"*(l-x)2 ไบต์
nmjcman101

@ nmjcman101 ดีมาก! ฉันต้องจำไว้ว่า ...
matsjoyce

ลองใช้print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))แทนprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
x1Mike7x

3

Node.js, 134 ไบต์

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

คล้ายกับ @ETHproductions (ยืมบางส่วนของการเพิ่มประสิทธิภาพ) แต่ใช้วิธีการที่แตกต่าง ใช้โหนดBufferเพื่อจัดการการสร้างตัวละครแทนความยาวString.fromCharCodeซึ่งมีประโยชน์ด้านการให้เราใช้mapโดยไม่ต้องสตริงมาก -> array-> ค่าใช้จ่ายการแปลงสตริง


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)

Ungolfed:

import random
import time

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

3

Dyalog APL , 59 58 ไบต์

วิธีการแก้

ต้องใช้⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ

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

แสดง

ด้วยการปรับหน้าต่างเป็นสองบรรทัดเราจะได้ภาพลวงตาของการแปลงในสถานที่:
ภาพเคลื่อนไหวถอดรหัสรหัส Dyalog APL

คำอธิบาย

นี่คือการฝึกอบรมฟังก์ชั่นไม่ระบุชื่อซึ่งใช้รหัสผ่านเป็นอาร์กิวเมนต์ที่ถูกต้อง

⊢⊣ ส่งคืนรหัสผ่านและยกเลิกผลลัพธ์ของ

≢{... ฟังก์ชั่นด้านล่างที่มีความยาวของรหัสผ่านเป็นอาร์กิวเมนต์ซ้ายใช้กับแต่ละ

2⊃⎕AIเวลาปัจจุบัน (สว่างองค์ประกอบที่สามของA ccount I nformation)

1E3+ เพิ่มวินาที

t←กำหนดให้กับt

ไม่สนใจว่า

⍵{... }⍣{t≤2⊃⎕AI}⍺ใช้ฟังก์ชั่นดังต่อไปนี้ (กับสตริงย่อยเป็นและยาวของรหัสผ่านเป็น ) ซ้ำ ๆ จนกระทั่งถึงเวลาถึงที

  ⍵⍴95 95 ซ้ำหลาย ๆ ครั้งเนื่องจากมีอักขระในรหัสผ่าน

  ? จำนวนเต็มแบบสุ่ม 0 ... 94

  32+เพิ่ม 32 (ทำให้ได้จำนวนเต็มแบบสุ่มyieldในช่วง 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);}}

อัลกอริทึมเช่นเดียวกับคำตอบของ Kevin Cruijssenเหมาะสำหรับ Java 8 โดยสิ้นเชิง

Ungolfed:

public class Tmp {

  interface X {

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

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

1

C #, 203 197 195 190 ไบต์

แข็งแรงเล่นกอล์ฟ:

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

Ungolfed:

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

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

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

l เก็บความยาวอินพุต

StopWatchและPath.GetRandomFileName()เป็นส่วนหนึ่งของ. NET Framework

EDIT1: Stopwatchการประกาศโดยนัย

EDIT2: การlเริ่มต้นผสานกับการประกาศ

แก้ไข 3: ขอบคุณ @Chris


คุณสามารถใช้วิธีการแบบคงที่ Stopwatch เริ่มต้นใหม่ () เพื่อบันทึกใหม่ขึ้นนาฬิกาจับเวลาและเริ่มต้นอย่างชัดเจน
Chris

@ Chris ฉันไม่รู้เกี่ยวกับวิธีการนั้นขอบคุณ
paldir

t++สามารถแทรกที่ใดก็ได้ในif ()
Mukul Kumar

@MukulKumar คุณช่วยให้รายละเอียดเพิ่มเติมกรุณา?
paldir

ใช้if (w.Elapsed.Seconds > t++)และลบt++;
Mukul Kumar

1

สกาลา, 259 254 248 233 232 231 227 225 ไบต์

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

Ungolfed:

import scala.concurrent.duration._;

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

    print(b)
}

1

ForceLang , 322 309 ไบต์

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

คุณสามารถเพิ่มลิงค์สำหรับภาษาการเขียนโปรแกรมที่คุณใช้หรือไม่
โซโลมอน Ucko

@SolomonUcko ไปเลย
SuperJedi224

1

C ++ (gcc) , 280 278 bytes

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

ป้อนคำอธิบายรูปภาพที่นี่

(ถ่าย @ 30fps)

วิธี:

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

0

PHP, 222 ไบต์

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

Ungolfed

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

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

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

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

    $cryptAmountToPrint = $endTime - time();

    $crypt = '';

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

    $output = $plain . $crypt;

    echo $output . "\n";

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

(ฉันรู้ว่าวิดีโอเป็นอึ) ป้อนคำอธิบายรูปภาพที่นี่


นี่อาจเป็นเรื่องของกอล์ฟมากขึ้น ตัวอย่างเช่นแทนที่จะ$c=range(32,127)แล้ว$r=chr($c[rand(0,94)])ทำไมไม่เพียง$r=chr(rand(0,94)+32)?
Xanderhall

จุดดี. มันเป็นสนามกอล์ฟครั้งแรกของฉัน: 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

เยี่ยมคุณควรโพสต์ผู้ชายคนนั้น
Nino Škopac

เพียงแก้ไขคำตอบของคุณคุณสามารถเปลี่ยนและปรับปรุงได้
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

Ungolfed:

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

ทำไมคุณไม่เก็บผลผลิตในตัวแปรแล้วเข้าร่วมพวกเขาทั้งหมดเพื่อหลีกเลี่ยง-nonewlineในputsพารามิเตอร์?
sergiol

ฉันคิดว่าคุณไม่ต้องการคนสองคนexprในตอนท้าย หนึ่งก็เพียงพอแล้วคุณยังสามารถหลีกเลี่ยงช่องว่างรอบ ๆ ได้ด้วย >
sergiol

ขอบคุณ @ sergiol ไม่มีช่องว่างอยู่รอบ ๆ > ดูที่รุ่นย่อ โปรดแนะนำวิธีการใช้งานexprในตอนท้ายฉันไม่เห็น
hdrz

ตัวอย่างคำแนะนำสองข้อของฉัน
sergiol

1
[set k [expr $k-1]][incr k -1]สามารถ และทุก `` `สามารถเป็นได้<โดยไม่ต้องเว้นวรรค
sergiol

0

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

Ungolfed

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

ป้อนคำอธิบายรูปภาพที่นี่

การเปลี่ยนชื่อSystem.currentTimeMillisบันทึกไว้ค่อนข้างน้อยไบต์!


0

QBIC , 92 88 ไบต์

ฉันแตกมันแล้ว!

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

สิ่งนี้อาศัยฟังก์ชั่น SLEEP ของ QBasic โดยใช้รหัสตามตัวอักษร$sleep 1|และLEFT$ฟังก์ชั่นของ QBasic เพราะฉันยังไม่ได้ใช้ฟังก์ชั่นนั้นใน QBIC ...

จัดการเพื่อขูดสองสามไบต์โดยแทนทั้งหมด20สำหรับtและการตั้งค่าที่ 20 นอกจากนี้ยังเพิ่มความคล่องตัวในการโทรสุ่มและห่วงสำหรับ

คำอธิบาย:

' 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 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.