पासवर्ड को क्रैक करने के लिए उन ब्रूट-फोर्स प्रोग्राम को याद रखें जो प्रत्येक संयोजन को दिखा रहे हैं जो वे कोशिश कर रहे हैं? अधिक सटीक रूप से, एक बिंदु पर, एन पहले अक्षर तय किए गए हैं (उन्हें सफलतापूर्वक अनुमान लगाया गया है), और शेष लोगों के लिए हर संभव चरित्र का परीक्षण किया जा रहा है। आपने शायद कुछ फिल्मों में, या लोगों द्वारा लिखे गए कुछ सॉफ़्टवेयर में देखा है जो कि फैंसी इंटरफेस पसंद करते हैं।
निराशा के लिए खेद है, लेकिन हम पासवर्ड क्रैक करने के लिए एक प्रोग्राम नहीं लिखेंगे, केवल एक अच्छा आउटपुट पुन: पेश करने के लिए।
चुनौती
एक स्ट्रिंग को प्रिंट करने योग्य एससीआई वर्णों को देखते हुए लेकिन कोई भी नयालाइन (एससीआई कोड 32 से 126 या रेगेक्स से मेल नहीं खाता ^[ -~]{2,}$
), इस नियम का पालन करते हुए एक आउटपुट प्रिंट करें:
- समय पर
t=n seconds
,n
मुद्रित किए गएn
पहले वर्ण इनपुट स्ट्रिंग के पहले वर्ण हैं। n
निश्चित वर्णों के बाद , आपको प्रारंभिक एक की लंबाई बनाने के लिए एक स्ट्रिंग का गठन यादृच्छिक चरित्र (यूनिकोड रेंजसे
~
(कोड 32 से 126)) के लिए समान रूप से छद्म यादृच्छिक रूप से चुना जाना चाहिए ।- आपको हर सेकंड कम से कम (उस पर बाद में) 20 लाइनों का आउटपुट देना चाहिए : उनमें से हर एक में
n
पहले अक्षर समान होंगे , लेकिन एक अलग यादृच्छिक अंत।
यह शायद अभी तक बहुत स्पष्ट नहीं है कि आप क्या करने वाले हैं, इसलिए एक उदाहरण के माध्यम से जाने दें:
उदाहरण
मैं 20 सेकंड के बजाय इसे और अधिक पठनीय बनाने के लिए हर सेकंड के लिए केवल 5 अलग-अलग लाइनें प्रिंट करूँगा।
इनपुट पर विचार करें abcde
।
पहले सेकंड के दौरान, एक वैध आउटपुट कुछ (पूरी तरह यादृच्छिक) हो सकता है:
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
फिर, t=1
प्रत्येक निम्नलिखित स्ट्रिंग a
का पहला वर्ण होगा (इनपुट का पहला वर्ण):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
अब, t=2
पहले दो वर्ण होंगे ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
अब, t=3
पहले तीन वर्ण होंगे abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
अब, t=4
पहले चार वर्ण होंगे abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
अंत में t=5
, हम इनपुट प्रिंट करते हैं (केवल एक बार):
abcde
कुछ पूर्वाग्रह
- आपको सेकंड के प्रति अपनी भाषा की सटीकता के साथ बहुत परेशान नहीं करना चाहिए (यानी यदि आपका एल्गोरिथ्म सही है लेकिन आपके सिस्टम / भाषा में सटीकता की कमी है तो यह ठीक है)।
- पहला सेकंड एक सेकंड से छोटा हो सकता है (यानी, यदि आप एक सेकंड के दौरान प्रोग्राम लॉन्च करते हैं, तो दूसरा सेकंड वर्तमान समय के अंत तक केवल शेष समय हो सकता है)। या अलग तरीके से कहें, तो आपको आउटपुट प्रिंट करने के लिए नए सेकंड के शुरू होने का इंतजार नहीं करना होगा।
- कम से कम 20 लाइनें प्रति सेकंड : अधिक प्राकृतिक तरीका एक विशेष लूप के साथ एक अनन्त लूप होगा जो हर सेकंड (या एक टाइमआउट, या जो भी हो) होगा, जिसके परिणामस्वरूप शायद प्रति सेकंड कुछ हजार लाइनें होंगी (और यह पूरी तरह से ठीक है! )। लेकिन अगर आपके पास एक और विचार है, तो इसका उपयोग करने के लिए स्वतंत्र महसूस करें जब तक कि आप प्रति सेकंड कम से कम 20 लाइनों को प्रिंट नहीं करते।
- इनपुट हमेशा 2 वर्णों से अधिक लंबा होगा।
- आप विचार कर सकते हैं कि यदि इनपुट मदद करता है तो इनपुट 30 वर्णों से अधिक लंबा नहीं होगा। (लेकिन अगर यह लंबे लोगों के लिए काम करता है, तो यह सबसे अच्छा है)
- इनपुट प्रारूप आपकी भाषा में एक स्ट्रिंग का सबसे प्राकृतिक प्रतिनिधित्व होना चाहिए।
- आपको एक अनुगामी न्यूलाइन प्रिंट करने की अनुमति है।
कोड उदाहरण
यदि आपको अभी भी ठीक से समझ नहीं आ रहा है कि आपको क्या करना है, तो आप एक लिनक्स टर्मिनल में निम्नलिखित कोड देख सकते हैं:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
कसौटी जीतना
यह कोड-गोल्फ है , बाइट जीत में सबसे छोटा कोड है!
लैकोनी और Flp.Tkc के लिए धन्यवाद उनके सुझाव और सैंडबॉक्स में सुधार के लिए।
\r
(उन सभी को एनीमेशन की तरह एक-दूसरे को परदे पर बदलना), या \n
स्वीकार्य है?
\n
पूरी तरह से स्वीकार्य है। इसके साथ संस्करण \r
सिर्फ यहाँ है क्योंकि यह बेहतर दिखता है, लेकिन आपको उन लोगों की आवश्यकता नहीं है \r
।