* 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
正しく機能するに$a
は、有効であるがランダムではないパスワードを事前に設定しないでください。含めたい場合a=
、行を前に分割すると、さらに3文字になりますが、繰り返し実行できます。もちろん、すべての改行を置き換えることもできる;
ため、ワンライナーを使用して、何度でも実行できます。
さらに、あなたが設定されている必要がありますLC_ALL=C
または任意のロケール固有の環境変数を設定します(ないLANG
とLC_CTYPE
文字範囲はASCII順に等しい照合順序に依存するため、特に)。
/dev/urandom
ランダムバイトのソースです。!-~
質問で指定されているすべての許容文字の範囲です。次の引数にリストされていないtr -dc
すべての文字を削除します。残りの15文字を受け取ります。必要な種類のそれぞれが少なくとも1回発生するかどうかを確認します。その入力は候補の4つのコピーで構成されているため、記号の順序は重要ではないため、すべての可能なパスワードが選択される可能性があります。grepを抑制し、出力します。head
grep
-q
理由は不明ですが、/dev/random
代わりに/dev/urandom
年齢がかかります。エントロピーはすぐに使い果たされたようです。に入れば、もう少しバイトを避けることができますcd
が/dev
、それはごまかしのように感じます。
Python 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
コードを読みやすくするために、ループの後に改行とインデントを追加しましたが、これは必要ではなく、カウントしませんでした。
これは、bashバージョンと本質的に同じ考えです。ここでのランダムなソースはrandom.sample
、要素を繰り返しません。この事実に対抗するために、許容される文字のリストのコピーを15個使用します。こうすることで、すべての組み合わせが引き続き発生しますが、文字が繰り返される組み合わせはあまり発生しません。しかし、この質問はすべての順列に対して等しい確率を必要とせず、可能性のみを必要としたため、これをバグではなく機能と見なすことにしました。
Python 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)
1つの改行と1つのインデントが再びカウントされません。いくつかのPython 3固有の構文オーバーヘッドを除けば、これはPython 2と同じソリューションです。
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)
読みやすくするために改行を追加しましたが、カウントしませんでした。
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
ループ内の改行とインデントが追加されましたが、カウントされません。気が;
向いたら、これを再び単一の区切り行に移動できます。