จำโปรแกรมที่กำลังดุร้ายเหล่านั้นที่จะถอดรหัสรหัสผ่านที่แสดงชุดค่าผสมที่พวกเขากำลังพยายามหรือไม่ แม่นยำมากขึ้นเมื่อถึงจุดหนึ่งที่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 สำหรับคำแนะนำและการปรับปรุงในกล่องทราย
\r
(ทำให้ทั้งหมดแทนที่หน้าจอเหมือนในภาพเคลื่อนไหว) หรือเป็น\n
ที่ยอมรับได้?
\n
เป็นที่ยอมรับอย่างสมบูรณ์ รุ่นที่มี\r
อยู่ที่นี่เพราะมันดูดีกว่า แต่คุณไม่ต้องการ\r
มัน