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, $akhô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=Choặc không đặt bất kỳ biến môi trường cụ thể cục bộ nào ( LANGvà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/urandomlà 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 -dcxóa tất cả các ký tự không được liệt kê trong đối số tiếp theo của nó. headmất 15 nhân vật còn lại.grepkiể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 -qgrep ngăn chặn đầu ra.
Vì lý do không rõ, /dev/randomthay vì /dev/urandommất tuổi. Có vẻ như entropy đã cạn kiệt khá nhanh. Nếu bạn cdvà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.