Trình tạo mật khẩu ngẫu nhiên


40

Máy chủ tên miền yêu cầu tất cả nhân viên phải có mật khẩu ngẫu nhiên, mạnh mẽ tuân thủ các quy tắc sau:

  • Chính xác là 15 ký tự.
  • Chỉ các ký tự có thể gõ bàn phím (như được hiển thị trong loại mã bên dưới). Không được phép dạy bán hàng để sử dụng mã ALT + NUMPAD.
  • Ít nhất 1 chữ cái viết thường: abcdefghijklmnopqrstuvwxyz
  • Ít nhất 1 chữ hoa: ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • Ít nhất 1 chữ số: 0123456789
  • Ít nhất 1 ký hiệu: `~!@#$%^&*()_+-={}|[]\:";'<>?,./

Vì mục đích này, CNTT đã đưa vào hoạt động và sẽ phân phối Trình tạo mật khẩu ngẫu nhiên cho tất cả nhân viên. Tất cả nhân viên sẽ được yêu cầu sử dụng Trình tạo mật khẩu ngẫu nhiên. Các yêu cầu đối với Trình tạo mật khẩu ngẫu nhiên là, ngoài các hạn chế về mật khẩu ở trên:

  • Nó phải có khả năng tạo ra tất cả các hoán vị của tất cả các ký tự được phép.
  • Nó phải hiển thị mật khẩu được tạo trên màn hình.
  • Mã được yêu cầu phải càng nhỏ càng tốt (tính bằng byte).

Vui lòng gửi giải pháp đề xuất của bạn trong tuần tới.


10
Bạn cũng nên yêu cầu tất cả các mật khẩu được phép xuất hiện với cùng một xác suất (nếu không tôi chỉ có thể tạo một danh sách dài 30 ký tự với các ký tự được phép, xáo trộn và đưa ra 15 mật khẩu đầu tiên)
Martin Thoma

@moose, đồng ý. Tôi đã thêm một quy tắc mới.
Thực phẩm điện tử cầm tay

22
Các nhân viên IT nên bị sa thải, hoặc ít nhất là được giáo dục tốt hơn: Nếu bạn tạo mật khẩu ngẫu nhiên, thì hạn chế bộ mật khẩu cho phép đối với những mật khẩu bao gồm ít nhất một ký tự của mỗi loại trên thực tế làm suy yếu mật khẩu, vì nó làm giảm kích thước của bộ cho phép. Và các chương trình của chúng tôi sẽ dễ dàng hơn nhiều nếu chúng tôi không phải kiểm tra xem OK OK, không sửa đổi cuộc thi sau khi có rất nhiều bài nộp; đó là một thử thách.
MvG


1
Bạn chưa thực sự trả lời @moose bằng cách yêu cầu tất cả mật khẩu đều có thể tạo được. Họ sẽ xuất hiện với xác suất như nhau.
Ethan Bolker

Câu trả lời:


29

Toán học (18)

Cho tôi một chút gian lận

= 15char ASCII pwd
&(^F7yP8k:*1P<t

PS không an toàn :)


6
Mã ở đâu?
DavidC

11
Điều đó có được đảm bảo để đáp ứng ít nhất một trong mỗi yêu cầu của lớp nhân vật không?
Thực phẩm điện tử cầm tay

3
@ Hand-E-Food Vâng, đúng vậy! Nếu bạn nhìn vào diễn giải bạn sẽ thấy: mật khẩu dài 15, chữ cái viết thường, chữ cái viết hoa bắt buộc, số bắt buộc, ký tự đặc biệt bắt buộc.
ybeltukov

6
+1 Thông minh, nhưng lén lút.
DavidC

10
Tôi biết rằng Mathicala có một chức năng cho tất cả mọi thứ, nhưng điều này ?
Konrad Borowski

13

Ruby, 74 69 byte

Chỉ cần lấy mẫu ngẫu nhiên từ phạm vi ascii 33 - 126 cho đến khi tất cả các lớp ký tự có mặt:

$_=[*?!..?~].sample(15)*''until~/\d/&&~/[a-z]/&&~/[A-Z]/&&~/\W|_/
p$_

Ruby, 39 byte

Sử dụng khám phá thông minh của nai sừng tấm:

p"0123abcdABCD-+/<".chars.sample(15)*''

Chỉnh sửa để đáp ứng mob:

Lưu ý rằng các quy tắc đã thay đổi sau khi tôi đăng bài này lần đầu tiên. Tại thời điểm cả hai mục trước áp dụng cho các quy tắc. Tôi cũng muốn chỉ ra rằng các quy tắc vẫn chưa được xác định rõ:

(..) tất cả các hoán vị của tất cả các ký tự được phép

"Hoán vị". Không hoán vị của các ký tự được phép tuân thủ các quy tắc còn lại, bởi vì bất kỳ hoán vị nào của tập hợp các ký tự được phép đều miễn là tập hợp các ký tự được phép (trong khi mật khẩu được cho là dài 15 ký tự). Và không có sự lặp lại trong một hoán vị. Tuy nhiên, mục đầu tiên của tôi vẫn còn "ngẫu nhiên" hơn nhiều câu trả lời được đánh giá cao khác ở đây.

Tuy nhiên, ở đây bạn có nó. Cho phép lặp lại các ký tự và dấu gạch dưới:

Ruby, 77 byte

$_=([*?!..?~]*15).sample(15)*''until~/\d/&&~/[a-z]/&&~/[A-Z]/&&~/\W|_/
puts$_

Tôi cũng đã sử dụng putsthay vì ptrong phần này vì pin ra chuỗi được bao trong "dấu ngoặc kép" và một số ký tự thoát bằng dấu gạch chéo ngược.

Ruby, 70 byte

Như Ventero chỉ ra, ~có thể bỏ qua trước các biểu thức chính quy và printcó thể thay thế puts$_. Nhưng với đầu ra xấu, điều này khiến bạn cũng có thể in tất cả các mật khẩu bị từ chối, ép nó thành một lớp lót:

puts$_=([*?!..?~]*15).sample(15)*''until/\d/&&/[a-z]/&&/[A-Z]/&&/\W|_/

Giải trình

Như yêu cầu. $_là một biến bán ma thuật chứa dòng cuối cùng được đọc từ đầu vào - vì vậy bạn không cần phải luôn lưu trữ nó, như thế này . Tuy nhiên, ở đây chúng tôi sử dụng nó vì một thuộc tính khác, cụ thể là ~toán tử áp dụng regex trực tiếp vào nó, một mẹo đầu tiên tôi học được bằng chron . Tôi đã thay thế cách sử dụng all, nhưng sẽ khá dễ hiểu nếu bạn nhận được phần còn lại ( xem tài liệu ).


2
Bạn có thể vui lòng giải thích mã của bạn một chút? Không gì .all?{|r|~r}làm gì? Không gì $_=làm gì?
Martin Thoma

3
Dòng mẫu là thông minh và tất cả, nhưng tôi nghĩ rằng nó vi phạm "Nó phải có khả năng tạo ra tất cả các hoán vị của tất cả các ký tự được phép." Không nơi nào nói rằng mật khẩu chỉ có thể chứa quảng cáo khi có liên quan đến các chữ cái. Nếu z là ký tự được phép, sẽ có cơ hội> 0 rằng z có trong mật khẩu.
nitro2k01

1
\Wtrong Ruby bao gồm dấu gạch dưới _? Trong hầu hết các phương ngữ regex tôi biết nó không. Và nếu mã của bạn không thể tạo mật khẩu trong đó một _ký tự là ký hiệu duy nhất không phải là chữ và số, thì nó sẽ vi phạm một yêu cầu. Cách tiếp cận thứ hai rõ ràng vi phạm yêu cầu đó, nhưng tôi đoán rằng nó không được thực hiện đúng lúc đó.
MvG

1
@MvG: Bạn đã đúng. \Wkhông chứa dấu gạch dưới trong RegEx ( nguồn ) tương thích với Perl .
Martin Thoma

1
Hơn nữa, giải pháp của bạn bị ảnh hưởng bởi cùng một vấn đề @moose và tôi gặp phải với Python: samplekhông lặp lại các yếu tố, vì vậy mật khẩu với các yếu tố lặp lại không thể được tạo bởi mã của bạn. Bạn có thể khắc phục hai vấn đề này để câu trả lời của bạn phù hợp với câu hỏi không? Xem làm thế nào của bạn là giải pháp hàng đầu, ngoại trừ Wolfram Alpha, sẽ rất tuyệt nếu bạn có thể tuân thủ và vẫn giữ được vị trí dẫn đầu. Tôi đoán nó không quá khó.
MvG

12

Java 8 - 354 329 319 275 267 ký tự

Chỉ để giải trí, sử dụng lambdas với Java 8 - mỗi đầu ra có thể có cùng xác suất được tìm thấy.

Nó sử dụng thực tế là các ký tự được phép có mã ascii liên tiếp, từ 33 đến 126.

class A {
    //flags for, respectively, small caps, large caps, digits, punctuation
    static int a, A, d, p;

    public static void main(String[] x) {
        String s;
        do {
            //Using special String constructor that takes an int[]
            s = new String(new java.util.Random().ints(15, 33, 127)
                                .toArray(),
                           0, 15);
            a = A = d = p = 0;
            s.chars()
                .map(c ->
                      c > 96 & c < 123 ? a = 1
                    : c > 64 & c < 90  ? A = 1
                    : c > 47 & c < 58  ? d = 1
                    : (p = 1))
                .min();
        } while (a + A + d + p < 4);
        System.out.println(s);
    }
}

Đầu ra mẫu:

.*;Tm?svthiEK`3  
o.dzMgtW5|Q?ATo  
FUmVsu<4JF4eB]1

Chương trình nén:

class A{static int a,A,d,p;public static void main(String[]x){String s;do{s=new String(new java.util.Random().ints(15,33,127).toArray(),0,15);a=A=d=p=0;s.chars().map(c->c>96&c<123?a=1:c>64&c<90?A=1:c>47&c<58?d=1:(p=1)).min();}while(a+A+d+p<4);System.out.println(s);}}


Làm thế nào về while(a+A+d+p<4)cùng với a|=1thay vì a++? Hoặc sử dụng bitmasks, tức là những thứ như a|=1thông qua a|=8, với a<15điều kiện vòng lặp. Điều này tiết kiệm thêm 13 ký tự nếu tôi đếm đúng.
MvG

@MvG điểm tốt - tôi đã làm một cái gì đó tương tự, tiết kiệm thêm một vài ký tự tôi tin.
assylias

@MvG Và sử dụng new String(int[],int,int)tiết kiệm 40 ký tự lẻ!
assylias

8

Python 2.X + 3.X (229 ký tự): Tạo và thay thế

Ý kiến

  1. Đầu tiên tạo một danh sách với 15 biểu tượng được phép
  2. Thay thế một vị trí ngẫu nhiên rbằng một chữ số ngẫu nhiên
  3. Thay thế một vị trí ngẫu nhiên s, bằng s != r, bằng chữ in hoa
  4. Tương tự cho chữ thường và ký hiệu như trong 2 và 3.

from random import randint as r, shuffle as s
a=list(range(15))
p=a[:]
for i in range(15):
    a[i]=chr(r(32,126))
s(p)
a[p.pop()]=chr(r(48,57))
a[p.pop()]=chr(r(65,90))
a[p.pop()]=chr(r(97,122))
a[p.pop()]=chr(r(33,47))
print(a)

Python 2.X + 3.X (194 ký tự): Tạo và kiểm tra

import random
from re import search as s
p=''
while not all([s("\d",p),s("[a-z]",p),s("[A-Z]",p),s("[\W_]",p)]):
 p=str(map(chr,[random.choice(list(range(33,127))) for i in range(15)]))
print(p)
  • Cảm ơn MvG đã nói với tôi điều đó \u\lkhông tồn tại trong regex Python.
  • Cảm ơn grc đã nói với tôi rằngrandom.sample không có sự thay thế, hãy lấy mọi mật khẩu được phép có thể mà chúng tôi cần lấy mẫu với sự thay thế.

Sử dụng lỗ hổng trong mô tả vấn đề

Hiện tại, mô tả vấn đề không yêu cầu mọi ký hiệu / chữ số xuất hiện với cùng một xác suất. Với giải pháp sau đây, bạn không thể đưa ra bất kỳ giả định nào về một ký hiệu và / hoặc vị trí. Nhưng bạn có thể làm điều đó với nhiều người.

Python 2.X + 3.X (62 ký tự)

from random import sample
print(sample("0123abcdABCD-+/<",15))

Cảm ơn daniero cho ý tưởng sử dụng mẫu.


Rất trơn tru tìm ra lỗ hổng! Tôi đã cắm cái đó, nhưng điểm thưởng để xác định nó. :-)
Thực phẩm điện tử cầm tay

Gen & kiểm tra của bạn là tương tự như phương pháp của tôi. Vì tò mò: đây là nơi nào \lvà như vậy cho regexes python được ghi lại? Đừng nhìn thấy nó trong tài liệu tham khảo . Python của tôi 3.3.3 thậm chí sẽ không chấp nhận "\u". Các str(…)không tham gia các ký tự trong hoặc 3.3.3 hoặc 2.7.6. Một gợi ý cho việc tối ưu hóa : all(s("\\"+i,p)for i in "dluW").
MvG

random.sampleChọn các yếu tố mà không cần thay thế, vì vậy không phải tất cả mật khẩu đều có thể.
grc

@MvG: Cảm ơn bạn. Tôi vừa thấy điều đó \uvà chỉ \llà vim.
Martin Thoma

7

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 ( LANGLC_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.


Hà! Tôi vừa mới chỉ ra rằng bạn có thể đã sử dụng greplmã R của mình. Nếu tôi chỉ nghĩ đến việc lặp lại mật khẩu kiểm tra bốn lần để bạn có thể thực hiện tất cả các kiểm tra trong một. Và bạn biết đấy, nếu tôi chỉ nghĩ về sampleintToUtf8. Tuy nhiên, bạn cần thêm replace=TRUE(hoặc chính xác hơn, bạn chỉ cần thêm ,T) vào phương thức mẫu của mình để đảm bảo bạn nhận được tất cả mật khẩu có thể.
AmeliaBR

@AmeliaBR: Bạn đã đúng, đã sửa replace=Tlỗi đó , cảm ơn vì đã chỉ ra điều này. Tìm kiếm intToUtf8bằng cách đoán tên có khả năng hoàn thành tab mất khá nhiều thời gian; Tôi biết một chức năng như vậy phải tồn tại, nhưng các tên phổ biến hơn như thế chrvà không được sử dụng.
MvG

@MvG: Tôi không hiểu tại sao mã Python của bạn chấm dứt. Tại sao bạn cần điều đó *4? Tôi nghĩ regex của bạn sẽ khớp với bất kỳ chuỗi nào, quảng cáo đầu tiên là một chữ cái viết hoa, sau đó là bất cứ thứ gì, sau đó là một chữ cái viết thường, hơn bất cứ thứ gì ... tôi đã làm gì sai?
Martin Thoma

@moose: Như bạn đã nhận thấy, regex của tôi kiểm tra các danh mục bắt buộc theo một thứ tự cụ thể. Nhưng bằng cách lấy bốn bản sao của ứng cử viên hiện tại, tôi có thể đảm bảo rằng thứ tự không còn quan trọng nữa: Ngay cả khi mật khẩu của tôi là các ký hiệu theo sau là chữ số theo sau chữ thường, thì vẫn có một kết quả khớp. Cách duy nhất một trận đấu có thể thất bại là nếu một danh mục bị thiếu hoàn toàn. Cũng lưu ý rằng tôi re.searchkhông re.match, vì vậy regex có thể khớp với bất kỳ nơi nào trong mật khẩu ứng cử viên. Điều này giải thích tại sao cuối cùng nó sẽ chấm dứt?
MvG

Ah, tôi không nhận thấy rằng bạn sử dụng re.searchthay vì re.match. Giải thích nó. Nhưng tôi vẫn nghĩ bạn không cần *4. Cảm ơn bạn đã giải thích (+1)
Martin Thoma

7

C # ( 123 - 139 103 - 127 ký tự được nén):

Sử dụng một phương pháp khung hoàn toàn đầy đủ trong System.Web.dll:

class P
{
    static void Main()
    {
        Console.WriteLine(System.Web.Security.Membership.GeneratePassword(15, 1));
    }
}

Nén:

class P{static void Main()
{Console.WriteLine(System.Web.Security.Membership.GeneratePassword(15,1));}}

Thí dụ:

b+m2ae0K:{dz7:A

Hoặc, lấy giá trị của tham số thứ hai ( int numberOfNonAlphanumericCharacters) từ dòng lệnh:

class P
{
    static void Main(string[] a)
    {
        Console.WriteLine(System.Web.Security.Membership.GeneratePassword(15, int.Parse(a[0])));
    }
}

3
GeneratePasswordkhông hỗ trợ tập hợp đầy đủ các ký hiệu được chỉ định trong câu hỏi. Tôi cũng không tìm thấy bất kỳ sự đảm bảo nào về số lần xuất hiện tối thiểu của mỗi loại nhân vật.
MvG

2
Bạn có thể thu gọn hơn nữa bằng cách sử dụng class Pstring[] a.
d3dave

@MvG, thật thú vị. Dường như nó không bao gồm bất kỳ biểu tượng nào thường được sử dụng để viết các ký tự có dấu bằng các ngôn ngữ như tiếng Pháp. Có lẽ là một động thái thông minh. Thay đổi ngôn ngữ bàn phím sẽ đủ để nhét mật khẩu của bạn.
Thực phẩm điện tử cầm tay

5

R (301 322 ký tự)

Sửa lỗi quên kiểm tra chữ số.

a='abcdefghijklmnopqrstuvwxyz';
f=as.factor(strsplit(paste(a,toupper(a),
    sep="0123456789`~!@#$%^&*()_+-={}|[]\\:\";'<>?,./"),"")[[1]]);
g=gsub("(.):","\\1",levels(q:q:q:q:q:q:q:q:q:q:q:q:q:q:q));
repeat{p=g[runif(1)*length(g)]; 
    if(grepl("[A-Z]",p)&&grepl("[a-z]",p)&&grepl("[0-9]",p)&&grepl("[^A-Za-z0-9]",p))break;};
print(p);

(khoảng trắng được thêm vào cho rõ ràng).

Tạo tất cả các hoán vị 15 ký tự có thể có của 94 ký tự. Sau đó chọn ngẫu nhiên một cho đến khi nó phù hợp với tiêu chí.

Phép thuật đang q:qhoạt động, tạo ra một kiểu dữ liệu nhân tố mới, đó là sự tương tác của tất cả các yếu tố trong qdanh sách đầu tiên với tất cả các yếu tố trong danh sách thứ hai , với mọi sự kết hợp có thể có của hai danh sách đó được đưa vào danh sách " cấp độ "của yếu tố đó. Tương tác 15 bản sao của danh sách các ký tự được phép và bạn có được (94 ^ 15) mức có thể.

Xin đừng thử điều này ở nhà. Mã mất vài giây để tìm ra tất cả các hoán vị ba ký tự, tôi thực sự không thể tưởng tượng được sẽ mất bao lâu để tìm ra tất cả các hoán vị 15 ký tự, nếu máy tính của bạn không hết bộ nhớ trong trong khi đó Khi tôi chạy tập lệnh đã hoàn thành (mật khẩu ba ký tự) để kiểm tra nó, mật khẩu đầu tiên mà nó nhổ ra là "oO =", tôi nghĩ về tổng hợp phản ứng mà bạn nên có đối với mã này.


@MvG có một tập lệnh R vừa thực tế hơn, vừa ngắn gọn hơn nhiều, nếu ít tuyệt vời hơn: codegolf.stackexchange.com/a/17700/12413
AmeliaBR

Tuy nhiên, tôi thích ý tưởng của bạn. Nhiều đoạn mã golf tôi đã thấy cho phép các tính năng cụ thể của ngôn ngữ làm việc chăm chỉ. Và mã của bạn chắc chắn làm điều đó cho R, với những tương tác đó.
MvG

4

Toán học 170

r=RandomSample;f[i_]:=(FromCharacterCode/@Range@@i);
{t,A,a,n}=f/@{{33,126},{65,90},{97,122},{48,57}};
s=Complement[t,A,a,n];
""<>r[Join[RandomChoice/@{A,a,n,s},r[t,11]],15]

Ví dụ

"<]} PG3 / e? 3 + Z ~ Oz"
"X / 8jwe @ f (_x5P: ="
"2wz2VQhtJC? * R7 ^"


4

Con trăn 2.7 (182)

import random as r,string as s
z=r.sample
j=list(z(s.ascii_lowercase,12)+z(s.ascii_uppercase,1)+z(s.digits,1)+z('`~!@#$%^&*()_+-={}|[]\\:";\'<>?,./',1))
r.shuffle(j)
print ''.join(j)

Bạn có thể nhận được ít hơn 9 chữ số bằng cách xóa tham gia vì mô tả sự cố không yêu cầu. Thêm 2 ít hơn bằng cách loại bỏ khoảng trắng.
Martin Thoma

@moose Tôi đã lấy ra khoảng trắng ngay trước khi bạn nhận xét :-) Tôi cảm thấy như jointhể có một loại: Người dùng sẽ được hiểu cú pháp danh sách python từ đầu ra : ['q', 'u', ...]?
Jonathon Reinhart

1
Tôi nghĩ về việc loại bỏ bản in. Khi kích thước tính theo byte là quan trọng, chúng có thể sống trong thời gian thẻ đục lỗ. Bằng cách đó, họ có thể đọc được ký ức ... chỉ bằng cách nhìn vào nó. Hoặc họ là "lập trình viên thực thụ": xkcd.com/378
Martin Thoma

1
Nếu tôi đọc mã chính xác, điều này không đáp ứng tất cả các yêu cầu hoán vị , nó sẽ luôn có 12 ký tự chữ thường, làm cho mật khẩu có nhiều hơn một trong các nhóm khác (như aA$bc1111111111) không thể.
IQAndreas

1
Để bảo vệ Johnathon, tôi nghĩ rằng quy tắc hoán vị đã được thêm 5 phút sau khi đăng bài.
Thực phẩm điện tử cầm tay

4

Golf (60)

Kể từ khi có nghĩa vụ. golfscript bị thiếu và là một noob tôi vẫn cần luyện tập :)

[48 10{rand}:r~+65 26r+97 26r+33 15r+11,{;32 96r+}%~]{r}$''+

Nó chỉ xây dựng một mảng với 4 ký tự ngẫu nhiên cần thiết + 11 và sắp xếp theo thứ tự ngẫu nhiên.


+1 cho {r}$. Đó là một cách khá bẩn để xáo trộn một danh sách - tôi thích nó! ;-)
Ilmari Karonen

... tuy nhiên, tôi không nghĩ điều này có thể xuất ra, ví dụ 0Aa~~~~~~~~~~~~. :-(
Ilmari Karonen

3

JavaScript 256 240 233 225

R=Math.random;a=b=>b[b.length*R()|0];for(x=[a(l="abcdefghijklmnopqrstuvwxyz"),a(u=l.toUpperCase()),a(n="0123456789"),a(s="`~!@#$%^&*()_+-={}|[]\\:\";'<>?,./")];15>x.length;x.push(a(l+u+n+s)));alert(x.sort(y=>.5-R()).join(""))

Sử dụng quy tắc trong đó:

function(x){return x*x}có thể được viết lại như function(x)x*x. Chỉ dường như làm việc cho các chức năng trả về một giá trị.

Phiên bản kế tiếp, giảm x.sort(function().5-R())tớix.sort(y=>.5-R())

Lặp lại tiếp theo, giảm hơn nữa với ký hiệu mũi tên béo, đáng buồn là chỉ hoạt động cho Firefox 22 trở lên.


Nén đẹp! : D
IQAndreas

2

JavaScript (nén 269 ký tự)

Để rõ ràng, đây là mã trước khi tôi nén nó xuống JS-Fiddle của nó :

var lowerLetters = "abcdefghijklmnopqrstuvwxyz";
var upperLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var numbers = "0123456789";
var symbols = "`~!@#$%^&*()_+-={}|[]\\:\";'<>?,./";
var allCharacters = lowerLetters + upperLetters + numbers + symbols;

String.prototype.randomChar = function() {
    return this[Math.floor(this.length * Math.random())];
}

var minLength = 15;
var result = [];

// Start off by picking one random character from each group
result.push(lowerLetters.randomChar());
result.push(upperLetters.randomChar());
result.push(numbers.randomChar());
result.push(symbols.randomChar());
// Next, pick a random character from all groups until the desired length is met
while(result.length < minLength) {
    result.push(allCharacters.randomChar());
}
result.shuffle(); // Finally, shuffle the items (custom function; doesn't actually exist in JavaScript, but is very easy to add) -> http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
result.join("");

Ở đây, nó được nén xuống còn 269 ký tự ( JS-Fiddle của nó ):

l="abcdefghijklmnopqrstuvwxyz";
u=l.toUpperCase();
n="0123456789";
s="`~!@#$%^&*()_+-={}|[]\\:\";'<>?,./";
R=Math.random;

function r(t){
    return t[~~(t.length*R())]
}

for(x=[r(l),r(u),r(n),r(s)];x.length<15;x.push(r(l+u+n+s)));
x.sort(function(){return .5-R()});
alert(x.join(""));

Vì tôi kết thúc dòng bằng dấu chấm phẩy, tất cả các khoảng trắng có thể tháo rời đã bị bỏ qua để đếm ký tự, nhưng để lại cho rõ ràng.
IQAndreas

Bạn có ý nghĩa gì shuffle()khi là một "chức năng tùy chỉnh". Đây có phải là một phần của JavaScript hoặc mã mà bạn sẽ phải tự viết không?
Thực phẩm điện tử cầm tay

@ Hand-E-Food Tôi có nghĩa là nó không được tích hợp vào JavaScript và vì bất kỳ nhà phát triển nào ở đây nên biết cách xáo trộn một mảng, tôi cảm thấy bao gồm cả chức năng trong mã là không cần thiết. Nó có sẵn trong JS-Fiddle mặc dù (dòng 16).
IQAndreas

1
Quan điểm của tôi là, nó được tính vào số byte của bạn. Nhưng tôi thấy bây giờ bạn đã thực hiện nó trong phiên bản rút gọn, vì vậy hãy bỏ qua cho tôi. :-)
Thực phẩm điện tử thực phẩm

2

Clojure (63):

(->> (map char (range 33 127)) (shuffle) (take 15) (apply str))

Nhưng cần phải được cải thiện để đảm bảo chứa ít nhất 1 ký tự của mỗi loại (Trên, Dưới, Chữ số, Biểu tượng).


2

Trong máy chủ sql

declare @a nvarchar(28)
set @a='abcdefghijklmnopqrstuvwxyz'
declare @b nvarchar(max)
set @b='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
declare @c nvarchar(max)
set @c='0123456789'
declare @d nvarchar(max)
set @d='~!@#$%^&*()_+-={}|[]\:";<>?,./'

select left(substring(@a,cast(rand()*10 as int),3)+substring(@b,cast(rand()*10 as int),6)+substring(@c,cast(rand()*10 as int),3)+substring(@d,cast(rand()*10 as int),5),15)

Xem nó trong hành động - 1

xem nó trong hành động - 2


1
Tôi gặp sự cố theo dòng cuối cùng, nhưng mã dường như không đáp ứng tất cả các yêu cầu hoán vị .
IQAndreas

Mã của bạn sẽ không bao giờ tạo bất kỳ mật khẩu nào bắt đầu bằng ~0Aa, cũng như bất kỳ mật khẩu nào bđược theo sau a.
Heinzi

@Heinzi: vâng, tôi đồng ý tất cả các hoán vị cần thiết không được tính đến, nó chỉ hiển thị 15 độ dài .. các ký tự được chọn ngẫu nhiên từ một ... z, A..Z, 0..9 ,! ... + :(. ..
vhadalgi

2

SÀI GÒN (191)

%macro c(p);compress(p,,"&p")ne''%mend;data x;length p$15;do x=1by 1;do t=1to 15;substr(p,t,1)=byte(ranuni(7)*94+33);end;if %c(kd)and %c(kl)and %c(ku)and %c(ad)then do;put p;stop;end;end;run;

*TQP,(f=h10*)S=

Nhận xét / thụt lề:

%macro c(p); /*compress removes or keeps certain classes of characters*/
  compress(p,,"&p")ne''
%mend;
data x;
length p$15;
do x=1by 1;
    do t=1to 15;
        substr(p,t,1)=byte(ranuni(7)*94+33); /*give it a 33-126, byte discards the noninteger portion rounding down*/
    end;
    if %c(kd)and %c(kl)and %c(ku)and %c(ad)then do; /*k=keep d=digit l/u=lower/upper ad=remove digits and alphas*/
        put p;
        stop;  /*met our requirement, head home*/
    end;
end;
run;

2

PowerShell: 119

Mã số

for(;!($x-cmatch'.*(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!-/:-@[-`{-~]).*')){$x='';1..15|%{$x+=[char](33..126|random)}}$x

Không chơi gôn và nhận xét

# Start for loop definition.
for(
    # Skip variable initialization, start definition of run condition.
    ;
    # Loop runs if $x does not meet complexity requirements.
    # Length requirement is not tested here because it is enforced by the generator later.
    # Much thanks to @VasiliSyrakis for the RegEx help.
    !($x-cmatch'.*(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!-/:-@[-`{-~]).*')
)
{
    # Reset $x in case the script block has already run.
    $x='';
    # Use ForEach-Object, via the % alias, to run a loop 15 times.
    1..15|%{
        # Append a random ASCII character from 33-126 to $x.
        # Note: Use get-random instead of random for faster performance.
        $x+=[char](33..126|random)
    }
}
# Display $x.
$x
# Variable cleanup - not included in golfed code.
rv x

Tôi nghĩ rằng biểu thức chính quy này có thể làm cho nó ngắn hơn một chút: ^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$bạn có thể thực hiện một trận đấu với điều này, điều này sẽ chỉ khớp khi có một Biểu tượng trên, dưới, chữ số, biểu tượng.
Vasili Syrakis

@VasiliSyrakis Ok, bạn có thể phải hướng dẫn tôi một chút. Hãy bắt đầu một phòng chat nếu bạn nghĩ rằng nó sẽ mất một lúc. Một vài điều tôi bối rối về: 1.) Tôi thấy số 15 bao gồm ở đó. Có phải để đảm bảo chuỗi có đúng 15 ký tự không? Nếu vậy, điều này có thể được bỏ qua, vì tập lệnh tự nhiên chỉ tạo ra chuỗi 15 ký tự. 2.) Ý bạn là gì "sẽ chỉ khớp khi có một chữ Thượng, Hạ, Chữ số, Biểu tượng"? Điều đó có nghĩa là nó sẽ chỉ phù hợp khi có chính xác một trong số đó, hoặc ít nhất một trong số đó? Các cựu sẽ phá vỡ mọi thứ.
Iszi

Ngoài ra, RegEx của bạn có bỏ qua việc sắp xếp các ký tự không? Ví dụ: nếu điều chỉnh xuống để khớp chuỗi 4 ký tự, cả hai 1aZ%(p3Rkhớp có phù hợp không? Tôi gặp một số khó khăn khi tìm cách để làm điều đó trực tuyến.
Iszi

Đã thử nghiệm RegEx mới với đầu ra từ tập lệnh hiện tại của tôi. Nó không có vẻ khá đáng tin cậy. Mã: $x-cmatch'^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$'Trận đấu hay: Trận đấu C>suD1?hTwbDx(z j%4O]HyeG|u[U$5 O/rGeD0$hJk=GO/thất bại: 3evthX3_X^nBrR` .nA ~ uYzrR4YV-r.`u-IjZE48ntQ;HxV
Iszi

Làm thế nào để tôi mở một phòng chat?
Vasili Syrakis

1

Con trăn 2.7 (149)

from random import*
''.join(map(lambda x:chr(randint(*(x[1]or(32,126)))),sorted(map(None,sample(range(15),15),((48,57),(65,90),(97,122),(33,47))))))

Viết ra một cách dễ đọc hơn (và không thể thực thi);

from random import *
''.join(                                          # Concatenate characters to string
  map(                                            # Map all characters using below lambda
    lambda x:chr(randint(*(x[1] or (32, 126)))),  # Map a single range to a random character
                                                  # within a specific range if supplied,
                                                  # otherwise the default "all" range.
    sorted(                                       # After distributing ranges, sort
      map(None,                                   # zip_longest alternative, distributes the
                                                  # required ranges over 4 random positions
        sample(range(15), 15),                    # 0-14 in random order
        ((48, 57), (65, 90), (97, 122), (33, 47)) # The 4 required ranges
      )
    )
  )
)

Khá thẳng về phía trước và đáng ngạc nhiên là không lâu hơn một phiên bản "tạo, thử lại trên trận đấu thất bại".


Bạn có chắc chắn điều này thực sự có thể tạo ra tất cả các mật khẩu đủ điều kiện, bao gồm cả ví dụ 0Aa~~~~~~~~~~~~? (Lưu ý rằng '~' == chr(126).)
Ilmari Karonen

1

PSQL (189)

Cảm giác như PSQL hơi dài dòng ... :)

SELECT ARRAY_TO_STRING(ARRAY_AGG(CHR((TRUNC((b-a)*RANDOM()+a))::int)ORDER BY RANDOM()),'')FROM(SELECT 32 a,127 b FROM generate_series(1,11)UNION ALL VALUES(48,58),(65,91),(97,123),(33,48))a

Bản demo SQLfiddle .


1

PHP, 235 225

Kịch bản lệnh này xáo trộn các ký tự xung quanh và sau đó được kiểm tra qua RegEx để đảm bảo mật khẩu mạnh (hoặc được tạo lại).

<?php
while(!preg_match('/^(?=.*[A-Z])(?=.*[^A-Za-z])(?=.*[0-9])(?=.*[a-z]).{15}$/',$p)){ $p = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()_+-={}|[]\:";\'<>?,./'),0,15); }
echo $p;

1
Thông minh, nhưng không cho phép các nhân vật trùng lặp.
Thực phẩm điện tử thực phẩm

1
Thay vì while(true) ... if (condition) breakbạn có thể sử dụngwhile (!condition)
exussum

1

Javascript (209)

r=Math.random;function t(x,y){return String.fromCharCode(Math.floor(y*r()+x))};x=[t(33,14),t(48,10),t(65,26),t(97,26)];for(i=0;i<11;i++)x.push(t(32,95));console.log(x.sort(function(){return r()-0.5}).join(''))

Bán vô chủ;

// Return a character in the range [x,x+y)
function t(x,y) { return String.fromCharCode(Math.floor(y*Math.random()+x)) }
// Prefill required ranges
x=[ t(33,14), t(48,10), t(65,26), t(97,26)]
// Push 11 totally random (valid) characters
for(i=0; i<11; i++)
  x.push(t(32,95))
// Shuffle and output as string
console.log(x.sort(function(){return Math.random()-0.5})
             .join(''))

1

Perl, 92

Không ngắn gọn như câu trả lời của Ruby, nhưng tôi chắc chắn rằng một trình hướng dẫn Perl có thể làm cho nó ngắn hơn nữa ... Tôi không quá hài lòng với tất cả các m//s ở cuối, nhưng dường như hoạt động và sẽ đáp ứng các điều kiện để cuối cùng tạo ra mọi hoán vị.

do{$_=join"",map{(map{chr}33..127)[rand 94]}0..14}while!(/[A-Z]/&/[a-z]/&/\d/&/[\W_]/);print

Sử dụng mẫu:

perl -e 'do{$_=join"",map{(map{chr}33..127)[rand 94]}0..14}while!(/[A-Z]/&/[a-z]/&/\d/&/[\W_]/);print'

Chỉnh sửa để xác nhận sửa chữa và thay đổi [[:punct:]]để [\W_]sau MvGs ý kiến.


1
Phần thế hệ của bạn là tốt, nhưng tiêu chí lựa chọn của bạn trong điều kiện vòng lặp hoàn toàn sai: ví dụ: mật khẩu aaaaaaaaaaaaaasẽ khiến vòng lặp chấm dứt. Bạn nên kiểm tra tiêu chí với mật khẩu không ngẫu nhiên để đảm bảo họ làm những gì bạn muốn.
MvG

Thật vậy, bạn đã đúng, tôi đã sửa lỗi này và lưu một số byte! Cảm ơn!
Dom Hastings

1
Bạn có chắc chắn về điều này [[:punct:]]? Tôi đoán tôi thích , which is shorter and of which I'm even more sure that it is correct, at least combined with your phạm vi '[\ W_] 33..127`.
MvG

Một điểm tốt, tôi nghĩ rằng tôi đã lo lắng rằng \Wkhông bao gồm _, tuy nhiên bạn hoàn toàn đúng, không cần thiết: gist.github.com/anonymous/8301237 . Cảm ơn bạn!
Dom Hastings

1

Java 7 ( 270 234 ký tự)

Tiền đề được sử dụng tương tự bởi @assylias với java 8 (tạo mật khẩu ngẫu nhiên cho đến khi mật khẩu hợp lệ). Tuy nhiên, thay vì sử dụng lambdas, mật khẩu được tạo bằng cách lặp lại một mảng char và được xác thực bằng cách khớp với biểu thức chính quy.

class A {
  public static void main(String [] a) {
    byte[] b = new byte[15];
    String s;
    do {
      new java.util.Random().nextBytes(b);
      s = new String(b);
    } while(!s.matches("(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\\d)(?=.*?[!-/:-@\\[-`]).*"));
    System.out.println(s);
  }
}

Mã rút gọn:

class A {public static void main(String[] a){byte[] b=new byte[15];String s;do{new java.util.Random().nextBytes(b);s=new String(b);}while(!s.matches("(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\\d)(?=.*?[!-/:-@\\[-`]).*"));System.out.println(s);}}

1

Quyền hạn


Một phiên bản lót (143 byte)

sal g random;1..11|%{$P+=[char](33..126|g)};(65..90|g),(97..122|g),(48..57|g),(33..47+58..64+123..126|g)|%{$P=$P.insert((1..11|g),[char]$_)};$P

Phiên bản nhỏ (146 byte)

sal g random
1..11|%{$P+=[char](33..126|g)}
(65..90|g),(97..122|g),(48..57|g),(33..47+58..64+123..126|g)|%{$P=$P.insert((1..11|g),[char]$_)}
$P

Phiên bản có thể đọc được (860 byte)

function pwgen {

    # Fulfill Upper,Lower,Digit,Symbol requirement by predefining ASCII ranges for each
    # These will be added into the string beginning at line 24

    [array[]]$symbolrange = (33..47),(58..64),(123..126)

    [char]$upper = (get-random (65..90))
    [char]$lower = (get-random (97..122))
    [char]$digit = (get-random (48..57))
    [char]$symbol = $symbolrange | get-random

    [char[]]$requirement = $upper + $lower + $digit + $symbol

    # Create the first 11 characters using any ASCII character between 32 - 126

    foreach ($number in (1..11)) {
        [string]$pass += [char](get-random (33..126))
    }

    # Insert each requirement character at a random position in the string

    foreach ($char in $requirement) {
        [string]$pass = $pass.insert((Get-Random (1..11)),$char)
    }

    return $pass
}

Tín dụng cho Iszi cho các mẹo khác nhau để rút ngắn mã.


1
Điều này không bao gồm tất cả các hoán vị. Ví dụ, abcd1234ABCD{|}~sẽ không bao giờ xuất hiện vì $symbolbuộc phải có ít nhất một trong số các biểu tượng nằm giữa ASCII 33 và 47.
Thực phẩm cầm tay

Nguy hiểm! Bạn phải chỉ ra sự lười biếng của tôi!? Đùa thôi ... Tôi đã chỉnh sửa nó bây giờ. Tôi cũng đã làm cho mỗi ký tự "yêu cầu" đi đến một chỉ mục riêng trong chuỗi, thay vì gộp bốn ký tự lại với nhau tại cùng một chỉ mục. Bây giờ nếu tôi có thể rút ngắn điều này ...
Vasili Syrakis

Có bất kỳ lý do nào bạn không thể cạo một vài nhân vật bằng cách rút ngắn $SR, có lẽ $Q?
Iszi

Bạn cũng có thể cắt các thứ như (g(65..90))xuống các 65..90|g'. And change the câu lệnh foreach` thành foreach-objectcác vòng lặp bằng %bí danh. Ví dụ: foreach($N in (1..11)){... }nên được doable như 1..11|%{... }. Tôi khá chắc chắn rằng có những tối ưu hóa khác có thể, nhưng tôi thực sự đã có một triển khai hoàn toàn khác trong tâm trí rằng tôi dự định thử lại sau.
Iszi

Mẹo hay :) Tôi rút ngắn nó xuống còn 213 byte nếu tôi lấy ra tiền vận chuyển và thay thế bằng dấu chấm phẩy.
Vasili Syrakis

1

Yếu tố, 196 ký tự

Thuật toán tương tự như MvG và moose's. Nó không phải là ngắn nhất nhưng phải đáp ứng tất cả các tiêu chí (hiện tại) trong câu hỏi:

USING: io kernel math pcre random sequences sequences.repeating ;
[ 15 94 random-integers [ 33 + ] "" map-as dup 60 cycle
"[A-Z].*[a-z].*[0-9].*[\\W_]" findall { } = not ] [ drop ] until print

Tôi có thể hiểu sai về regex, nhưng tôi nghĩ một cái gì đó giống như ~{}|1234abcdABCDsẽ làm thất bại regex.
Thực phẩm điện tử

1
Không, nó sẽ hoạt động:"~{}|1234abcdABCD" 60 cycle "[A-Z].*[a-z].*[0-9].*[\\W_]" findall empty? not => t
Bjorn Lindqvist

Ill dùng từ ngữ của bạn cho nó. :-)
Thực phẩm điện tử cầm tay

1

C - 154 ký tự

char p[16],c,f,w;main(){srand(time());while(f^15){c=p[15]=f=0;while(c^15){w=33+rand()%94;f|=w
>96&&w<123?1:w>47&&w<59?2:w>64&&w<91?4:8;p[c++]=w;}}puts(p);}

Làm thế nào để tôi ghét srand()? Hãy để tôi tính cách.


1

Haskell, 192

import System.Random
main=getStdGen>>= \g->(print.(take 15))$until((\x->all(any(`elem`x))[['a'..'z'],['A'..'Z'],['0'..'9'],['!'..'/']++":;<=>?@[\\]^_`{|}~"]).(take 15))tail$randomRs('"','~')g

Chuỗi in có các trích dẫn xung quanh nó và thoát khỏi dấu gạch chéo ngược và ký tự trích dẫn; nếu điều đó không được chấp nhận, printcó thể được thay thế bằngputStrLn 3 byte nữa. Đây là một phiên bản dễ đọc hơn:

import System.Random

main = do
    g <- getStdGen
    let chars = randomRs ('"', '~') g
    let password = take 15 $ until (hasChars.(take 15)) tail chars
    print password

hasChars :: String -> Bool
hasChars x = all (any (`elem` x)) $
    [ ['a'..'z']
    , ['A'..'Z']
    , ['0'..'9']
    , "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
    ]

Nó khá đơn giản, nó chỉ tạo ra một vô hạn / danh sách lười biếng của các ký tự ASCII ngẫu nhiên trong phạm vi '!'đến '~', sau đó tung ra phần tử đầu tiên cho đến khi 15 ký tự đầu tiên có ít nhất một nhân vật từ mỗi chuỗi ký tự cần thiết.


1

VBA Excel, 209 byte

For i = 1 To 15
x = x + Chr(Int(90 * Rnd + 33))
Next
p = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$"
With New RegExp
.Pattern = p
Set m = .Execute(x)
If m.Count = 0 Then
MsgBox "redo"
Else
MsgBox x
End If
End With

Tạo ngẫu nhiên 15 ký tự ASCII để tất cả các kết hợp có thể có thể. Sau đó, sử dụng một mẫu biểu thức chính quy để kiểm tra xem nó có chứa ít nhất một trong mỗi tiêu chí không.

Nếu có thì mật khẩu sẽ được hiển thị, nếu không "làm lại" sẽ được hiển thị.

Tín dụng cho Bart Kiers cho mẫu Biểu thức thông thường: https://stackoverflow.com/questions/1559751/regex-to-make-sure-that-the-opes-contains-at-least-one-lower-case-char- phía trên


0

AutoHotkey 352

global o:={}
loop 4
o[c()]:=o(A_index-1)
loop 11
o[c()]:=o(m(r(),4))
loop 15
s.=o[A_index-1]
msgbox % s
r(){
Random,z
return z
}
m(z,r){
return mod(z,r)
}
c(){
while o[t:=m(r(),15)]!=""
j++
return t
}
o(f){
r0:=48,l0:=10,r1:=97,l1:=l2:=26,r2:=65
r := chr(r%f%+m(r(),l%f%))
if f=3
r:=Substr("``~!@#$%^&*()_+-={}|[]\:"";'<>?,./",m(r(),32)+1,1)
return r
}

Sử dụng - Chỉ cần chạy tập lệnh


0

Con trăn (121 ký tự)

Sử dụng thực tế là bạn có thể nhân các danh sách trong Python [1,2,3] * 2 cho [1,2,3,1,2,3]. Nhập khẩu ngẫu nhiên. Các số trong danh sách nhân với ba là biên giữa các phạm vi trong bảng ascii cho các ký tự cần thiết, ví dụ: ánh xạ [65, 90] thành chữ in hoa.

print "".join([random.choice([chr(i) for i in range(z[0],z[1])]) for z in [[33,48],[48,58],[58,65],[65,90],[90,123]]* 3])

1
"Nó phải có khả năng tạo ra tất cả các hoán vị của tất cả các ký tự được phép.". Tôi không nghĩ rằng nó làm điều đó vì các phạm vi luôn được áp dụng theo cùng một thứ tự ...?
Joachim Isaksson

Bạn nói đúng, cảm ơn bạn. Quả thực tôi đã không nhận thấy rằng các phạm vi nên được áp dụng theo thứ tự ngẫu nhiên, chúng sẽ được xáo trộn, tôi sẽ chỉnh sửa nó ngay lập tức.
Pawelmhm

Điều này cần phải thực sự bao gồm import randomtrong mã.
Mego

0

PHP 5.5 (230 byte)

echo preg_replace_callback('/./', function ($a)
{
  return chr([rand(33, 126), rand(48, 57), rand(65, 90), rand(97, 122), ord(str_shuffle('`~!@#$%^&*()_+-={}|[]\:";\'<>?,./')[0])][$a[0]]);
}
, str_shuffle(str_pad('1234', 15, 0)));

Hoặc trên một dòng (211 byte)

echo preg_replace_callback('/./',function($a){return chr([rand(33,126),rand(48,57),rand(65,90),rand(97,122),ord(str_shuffle('`~!@#$%^&*()_+-={}|[]\:";\'<>?,./')[0])][$a[0]]);},str_shuffle(str_pad('1234',15,0)));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.