배쉬 온 * 닉스 (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
모든 문자를 제거합니다 . 나머지 문자 15 개를 가져옵니다. 필요한 각 종류가 한 번 이상 발생하는지 확인합니다. 입력은 4 개의 후보 사본으로 구성되므로 기호 순서는 중요하지 않으므로 가능한 모든 암호를 선택할 수 있습니다. 는 억압 grep을 출력한다.head
grep
-q
알 수없는 이유로 나이 /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
코드를 읽을 수 있도록 루프 뒤에 줄 바꿈과 들여 쓰기를 추가하여 필요하지 않고 계산하지 않았습니다.
이것은 기본적으로 bash 버전과 동일합니다. 여기서 임의의 소스는 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 고유의 구문 오버 헤드 외에도 Python 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)
가독성을 위해 줄 바꿈을 추가했지만 계산하지는 않았습니다.
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
루프 내부의 줄 바꿈 및 들여 쓰기가 추가되었지만 계산되지 않았습니다. 기분이 ;
좋으면 다시 한 줄로 분리 할 수 있습니다 .