Bash trên * 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
Để hoạt động chính xác, $a
không được đặt thành mật khẩu hợp lệ nhưng không ngẫu nhiên lên phía trước. Nếu bạn muốn bao gồma=
và một dòng chia tay phía trước, đó là ba ký tự nữa nhưng nó cho phép bạn chạy điều đó nhiều lần. Bạn rõ ràng cũng có thể thay thế tất cả các dòng mới bằng ;
để bạn có một lớp lót mà bạn có thể thực hiện thường xuyên như bạn muốn.
Hơn nữa, bạn nên đặt LC_ALL=C
hoặc không đặt bất kỳ biến môi trường cụ thể cục bộ nào ( LANG
vàLC_CTYPE
cụ thể), vì phạm vi ký tự phụ thuộc vào thứ tự đối chiếu bằng với thứ tự ascii.
/dev/urandom
là nguồn của các byte ngẫu nhiên. !-~
là phạm vi của tất cả các ký tự cho phép, như được chỉ định trong câu hỏi. tr -dc
xóa tất cả các ký tự không được liệt kê trong đối số tiếp theo của nó. head
mất 15 nhân vật còn lại.grep
kiểm tra xem mỗi loại yêu cầu có xảy ra ít nhất một lần không. Đầu vào của nó bao gồm bốn bản sao của ứng cử viên, vì vậy thứ tự của các ký hiệu không quan trọng, do đó tất cả các mật khẩu có thể có cơ hội được chọn. Các -q
grep ngăn chặn đầu ra.
Vì lý do không rõ, /dev/random
thay vì /dev/urandom
mất tuổi. Có vẻ như entropy đã cạn kiệt khá nhanh. Nếu bạn cd
vào/dev
, bạn có thể tránh thêm một số byte, nhưng điều đó cảm thấy hơi giống như gian lận.
Con trăn 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
Để làm cho mã có thể đọc được, tôi đã thêm một dòng mới và thụt lề sau vòng lặp không cần thiết và tôi không tính.
Đây thực chất là ý tưởng giống như trong phiên bản bash. Nguồn ngẫu nhiên ở đây là random.sample
, sẽ không lặp lại các yếu tố. Để chống lại thực tế này, chúng tôi sử dụng 15 bản sao của danh sách các chữ cái được phép. Theo cách đó, mọi sự kết hợp vẫn có thể xảy ra, mặc dù những người có chữ lặp đi lặp lại sẽ ít xảy ra hơn. Nhưng tôi quyết định coi đây là một tính năng, không phải là một lỗi, vì câu hỏi không yêu cầu xác suất như nhau cho tất cả các hoán vị, chỉ có khả năng.
Con trăn 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)
Một dòng mới và một lần thụt lề một lần nữa không được tính. Ngoài một số cú pháp cụ thể của Python-3, đây là giải pháp tương tự như đối với 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)
Tôi đã thêm các dòng mới để dễ đọc, nhưng không tính chúng.
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
Linebreak và thụt vào bên trong vòng lặp được thêm nhưng không được tính. Nếu bạn cảm thấy thích nó, bạn có thể một lần nữa di chuyển nó sang một ;
dòng riêng biệt.