Bash üzerinde * nix (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
Düzgün çalışmak için, $a
önceden geçerli ancak rastgele olmayan bir parola ayarlanmamalıdır. Dahil etmek a=
ve bir satır önde olmak istiyorsanız , bu üç karakter daha var, ancak tekrar tekrar çalıştırmanıza olanak tanıyor. Açıkçası tüm yeni satırları değiştirebilir, ;
böylece dilediğiniz sıklıkta uygulayabileceğiniz tek bir gömlek kullanabilirsiniz.
Ayrıca, karakter aralıkları ascii düzene eşit olan harmanlama sırasına bağlı olduğundan LC_ALL=C
yerel ve belirli herhangi bir ortam değişkenini ( LANG
veya LC_CTYPE
özellikle de) belirlemelisiniz veya ayarlamamalısınız .
/dev/urandom
rastgele baytların kaynağıdır. !-~
soruda belirtildiği gibi izin verilen tüm karakterlerin aralığıdır. tr -dc
tüm karakterleri kaldırır değil bir sonraki argüman listelenen. head
kalan karakterlerden 15 tanesini alır. grep
Gerekli türlerin her birinin en az bir kez gerçekleşip gerçekleşmediğini kontrol eder. Girdileri adayın dört nüshasından oluşuyor, bu nedenle sembollerin sırası önemli değil, bu nedenle olası tüm şifreler seçme şansına sahip. -q
Bastırır çıktı grep.
Nedenleri bilinmeyen için, /dev/random
yerine /dev/urandom
yaşları alır. Entropi oldukça çabuk tükenmiş gibi görünüyor. Eğer cd
içine /dev
koyarsanız, biraz daha bayttan kaçınabilirsiniz, ancak bu biraz hile gibi geliyor.
Piton 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
Kodu okunaklı kılmak için, gerekli olmayan ve saymadığım döngüden sonra yeni bir satır ve girintiler ekledim.
Bu aslında bash versiyonundakiyle aynı fikirdir. Buradaki rastgele kaynak random.sample
, elemanları tekrar etmeyecek olmasıdır. Bu gerçeğe karşı koymak için, izin verilen mektuplar listesinin 15 kopyasını kullanıyoruz. Bu şekilde, tekrarlanan harfleri olanlar daha az gerçekleşse de, her kombinasyon hala gerçekleşebilir. Ancak bu sorunun bir hata olarak görülmemesine karar verdim, çünkü soru tüm permütasyonlar için eşit olasılık gerektirmiyordu, sadece olasılık.
Piton 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)
Bir newline ve bir girinti tekrar sayılmaz. Bazı Python-3'e özgü sözdizimlerinin yanı sıra, bu Python 2 ile aynı çözümdür.
JavaScript (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)
Okunabilirlik için yeni satırları ekledim ancak saymadım.
R (114)
s<-""
while(!grepl("[A-Z].*[a-z].*[0-9].*(\\W|_)",paste(rep(s,4),collapse="")))
s<-intToUtf8(sample(33:126,15,T))
s
Döngü içindeki satır sonu ve girinti eklendi, ancak sayılmadı. Eğer böyle hissederseniz, bunu tekrar ayrı bir ;
satıra taşıyabilirsiniz .