बैश ऑन * निक्स (109)
while ! grep -Pq [A-Z].*[a-z].*[0-9].*[\\W_]<<<$a$a$a$a
do a=`tr -dc !-~</dev/urandom|head -c15`
done
echo $a
सही ढंग से काम करने के लिए, $a
एक वैध लेकिन गैर-यादृच्छिक पासवर्ड को सामने नहीं रखना चाहिए। यदि आप शामिल करना चाहते हैं a=
और एक पंक्ति टूट जाती है, तो यह तीन और वर्ण हैं लेकिन यह आपको बार-बार बात चलाने की अनुमति देता है। आप स्पष्ट रूप से सभी नई सूचियों को भी बदल सकते हैं ;
ताकि आपके पास एक-लाइनर हो जिसे आप जितनी बार चाहें उतनी बार निष्पादित कर सकते हैं।
इसके अलावा, आपको LC_ALL=C
किसी स्थानीय-विशिष्ट वातावरण चर ( LANG
या LC_CTYPE
विशेष रूप से) को सेट या सेट नहीं करना चाहिए , क्योंकि वर्ण श्रेणियाँ महाविद्यालय के आदेश पर निर्भर करती हैं।
/dev/urandom
यादृच्छिक बाइट्स का एक स्रोत है। !-~
सभी अनुमत वर्णों की श्रेणी है, जैसा कि प्रश्न में निर्दिष्ट है। tr -dc
सभी पात्रों को हटा नहीं अपनी अगली तर्क में सूचीबद्ध। head
शेष पात्रों में से 15 लेता है। grep
जाँचता है कि क्या प्रत्येक आवश्यक प्रकार कम से कम एक बार होता है। इसके इनपुट में उम्मीदवार की चार प्रतियां शामिल हैं, इसलिए प्रतीकों का क्रम कोई मायने नहीं रखता है, इसलिए सभी संभावित पासवर्ड चयनित होने का एक मौका देते हैं। -q
दबा उत्पादन grep करने के लिए।
अज्ञात कारणों से, उम्र के /dev/random
बजाय /dev/urandom
। ऐसा लगता है जैसे एन्ट्रापी बहुत जल्दी थक गया। यदि आप cd
में हैं /dev
, तो आप कुछ और बाइट्स से बच सकते हैं, लेकिन यह धोखा जैसा महसूस होता है।
पायथन 2 (138)
import re,random
a=''
while not re.search('[A-Z].*[a-z].*[0-9].*[\W_]',a*4):
a=''.join(random.sample(map(chr,range(33,127))*15,15))
print a
कोड को पठनीय बनाने के लिए मैंने लूप के बाद एक नई रेखा और इंडेंटेशन जोड़ा, जो परिशिष्ट नहीं है और जिसे मैंने नहीं गिना।
यह मूल रूप से बैश संस्करण के समान ही विचार है। यहां यादृच्छिक स्रोत है random.sample
, जो तत्वों को नहीं दोहराएगा। इस तथ्य का मुकाबला करने के लिए, हम अनुमेय पत्रों की सूची की 15 प्रतियों का उपयोग करते हैं। इस तरह, हर संयोजन अभी भी हो सकता है, हालांकि दोहराया अक्षरों वाले लोग अक्सर कम होंगे। लेकिन मैं इस सुविधा पर विचार करने का निर्णय लेता हूं, बग नहीं, क्योंकि प्रश्न को सभी क्रमपरिवर्तन के लिए समान संभावना की आवश्यकता नहीं थी, केवल संभावना।
पायथन 3 (145)
import re,random
a=''
while not re.search('[A-Z].*[a-z].*[0-9].*[\W_]',a*4):
a=''.join(random.sample(list(map(chr,range(33,127)))*15,15))
print(a)
एक न्यूलाइन और एक इंडेंट की फिर से गिनती नहीं की गई। कुछ पायथन-3-विशिष्ट सिंटैक्स ओवरहेड के अलावा यह वही समाधान है जो पायथन 2 के लिए है।
जावास्क्रिप्ट (161)
a=[];for(i=33;i<127;)a.push(s=String.fromCharCode(i++));
while(!/[A-Z].*[a-z].*[0-9].*[\W_]/.test(s+s+s+s))
for(i=0,s="";i<15;++i)s+=a[Math.random()*94|0];alert(s)
मैंने पठनीयता के लिए नए अंक जोड़े, लेकिन उनकी गिनती नहीं की।
आर (114)
s<-""
while(!grepl("[A-Z].*[a-z].*[0-9].*(\\W|_)",paste(rep(s,4),collapse="")))
s<-intToUtf8(sample(33:126,15,T))
s
लूप के अंदर लाइनब्रेक और इंडेंटेशन जोड़ा गया, लेकिन गिना नहीं गया। यदि आपको ऐसा लगता है, तो आप इसे फिर से सिंगल- ;
सेपरेटेड लाइन में स्थानांतरित कर सकते हैं ।