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=Cyerel ve belirli herhangi bir ortam değişkenini ( LANGveya LC_CTYPEözellikle de) belirlemelisiniz veya ayarlamamalısınız .
/dev/urandomrastgele baytların kaynağıdır. !-~soruda belirtildiği gibi izin verilen tüm karakterlerin aralığıdır. tr -dctüm karakterleri kaldırır değil bir sonraki argüman listelenen. headkalan karakterlerden 15 tanesini alır. grepGerekli 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. -qBastırır çıktı grep.
Nedenleri bilinmeyen için, /dev/randomyerine /dev/urandomyaşları alır. Entropi oldukça çabuk tükenmiş gibi görünüyor. Eğer cdiçine /devkoyarsanı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 .