Viết chương trình thực hiện kết hợp chữ cái vũ phu cho đến khi tìm thấy từ mật khẩu.


16

Chương trình nên in mọi tổ hợp chữ cái (chữ thường hoặc chữ hoa, không thành vấn đề) theo thứ tự chữ cái. Nó phải bắt đầu bằng avà sự kết hợp in cuối cùng phải được password.

Đầu ra phải là:

a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ... passwora passworb passworc password

2
Các dấu phân cách phải là khoảng trắng, hoặc tôi có thể sử dụng dòng mới không?
Ilmari Karonen

Có bạn có thể, nó chỉ là một thay đổi nhỏ.
ST3

Câu trả lời:


32

Perl, 19 ký tự

say for a..password

Sử dụng các dòng mới dưới dạng dấu phân cách, mỗi lần làm rõ ở trên. Chạy với perl -M5.010(hoặc chỉ perl -E 'say for a..password') để bật saytính năng Perl 5.10+ . Trên mỗi meta , điều này không được tính là ký tự thêm.

(Nếu bạn nhấn mạnh vào không gian như delimiters, $,=$";say a..passwordlà chỉ có hai ký tự dài hơn. Tuy nhiên, nó cũng rất chậm và lãng phí bộ nhớ, đến mức là không sử dụng được trong thực tế, kể từ khi nó cố gắng để xây dựng toàn bộ danh sách trong bộ nhớ trước khi in nó.)


18

Ruby, 33 ký tự (phiên bản tối ưu nhưng dài hơn)

?a.upto('password'){|c|$><<c+' '}

Tôi thích cái 'a'.upto('password'); nó cho bạn biết chính xác những gì nó đang làm. Ruby thật tuyệt vời và biểu cảm như thế.:D

Tất nhiên, print c,' 'cũng sẽ rõ ràng hơn nhiều, nhưng sử dụng $>ngắn hơn hai ký tự.

Ruby, 29 25 ký tự (phiên bản chậm)

$><<[*?a..'password']*' '

Cái này ngắn hơn, nhưng nó in tất cả các mã thông báo cùng một lúc, vì vậy phải mất một thời gian dài để chạy!


1
Đẹp, đặc biệt là đầu tiên.
Cary Swoveland

Trong phiên bản chậm, (?a..'password').to_acó thể rút ngắn thành[*?a..'password']
Paul Prestidge

6

Perl, 33 32 24 ký tự

Một giải pháp trong 32 ký tự:

$_=a;print$_++,$"until/passwore/

Không có nhiều điều để nói về cái này. Tôi có thể giảm ký tự này xuống còn 27 ký tự nếu tôi có thể sử dụng dòng mới thay vì khoảng trắng để phân tách các mục nhập.

Ilmari Karonen chỉ ra rằng ..các cuộc gọi nội bộ ++, vì vậy một giải pháp tốt hơn (25 ký tự) sẽ là:

print$_,$"for a..password

Bằng cách tận dụng các tùy chọn dòng lệnh của Perl, đây là một giải pháp 24 ký tự tương đương:

perl -l40e 'print for a..password'

Các quy tắc đếm cờ perl có ở đây, dành cho những người không quen thuộc với chúng.

Tất nhiên, giải pháp 21 ký tự của Ilmari vẫn ngắn hơn, nhưng nó đòi hỏi một cỗ máy có thể phân bổ một mảng gồm 129.052.722.140 chuỗi.


Sẽ không .$"thay vì ," "tiết kiệm một nhân vật?
Ông Llama

Đúng, tổng giám sát về phía tôi. Cảm ơn.
hộp bánh mì

6

Perl 6, 20 ký tự

say "a".../password/

Bạn không cần những thứ khác


5

Con trăn 2, 91

b=lambda n:n*' 'and b(n/26-(n%26<1))+chr(~-n%26+97)
i=0
exec"i+=1;print b(i);"*129052722140

4

PHP 38 37 36 ký tự

<?for($w=a;$w<passwore;)echo$w++,~ß;

Bạn phải đặt mã hóa thành ISO 8859-1 và tắt cảnh báo.


Tôi đã không kiểm tra điều đó, nhưng nó thực sự làm điều đó ???
ST3

@ ST3 Đó là một vòng lặp đơn giản. Biến $wban đầu được đặt thành 'a' và sau đó được tăng cho đến khi đạt đến giá trị đầu tiên sau 'mật khẩu' (chuỗi cuối cùng không được in).
lortabac

3
@ ST3 Đó là một forvòng lặp thông thường . Không có gì lạ trong mã này, ngoại trừ 2 ký tự cuối cùng, là một khoảng trắng được đảo ngược theo bit. Dù sao, vâng, tôi đã kiểm tra nó đến một từ ngắn hơn.
lortabac

1
@ ST3 Đây là một bài kiểm tra từ passwoqsđến password. Vì mã hóa của codepad không phải là ISO 8859-1, tôi đã phải thay thế bằng một khoảng trắng.
lortabac

1
Bạn có thể lưu một char với $w<passworethay cho $w!=passwore.
Dabbler Decent 15/12/13

2

Ruby (40 ký tự)

Giải thích một chuỗi các chữ cái az là một số trong cơ sở 26, với a = 1, b = 2, ..., z = 26.

Vì vậy, "mật khẩu" có thể được coi là số N =

16*(26**7) + 
1*(26**6) + 
19*(26**5) + 
19*(26**4) + 
23*(26**3) + 
15*(26**2) + 
18*(26**1) + 
4*(26**0)

Nếu chúng ta để s = "a"(đó là: 1) và chúng ta thực hiện (N-1) các cuộc gọi đến s.succ!, s sẽ là "password"(N). Nói cách khác, N = 1 + (N-1).

Đối với một ví dụ sẽ chạy nhanh hơn, để chứng minh tính toán của N là chính xác, hãy xem xét "pass"như là mục tiêu, trong đó N là

16*(26**3) + 
1*(26**2) + 
19*(26**1) + 
19*(26**0)

s = "a"
(N-1).times { s.succ! }
puts s #== "pass"

Vì chúng tôi cũng muốn in "a", chúng tôi cần

s = "`"
N.times { print(s.succ! + " ") }

Vì vậy, trở lại đầy đủ "mật khẩu". N = 129052722140, rời đi:

s=?`;0x1e0c2443dc.times{$><<s.succ!+" "}

Tôi đã săn lùng một hình thức nhỏ gọn hơn 129052722140 == 0x1e0c2443dbnhưng không thể tìm thấy.

(Cập nhật để sửa lỗi thiếu in "a", nhờ Cary.)


1
Adam, đó hẳn là bạn trong suy nghĩ của tôi. Bạn không muốn bắt đầu một cái trước 'a'?
Cary Swoveland

Tôi nghĩ rằng những gì bạn đang nhận được là tôi đã sử dụng Nthay vì N-1trong các lần lặp của tôi! Cảm ơn, tôi sẽ chỉnh sửa để sửa chữa. (Mặc dù 129052722140 là một con số thú vị đối với Google :).)
Adam Prescott

1
0x1e0c2443db chỉ có nhiều ký tự như 129052722139.
steenslag

Ý tôi là nếu s=?a, s.succ!bắt đầu từ 'b'`.
Cary Swoveland

1
Với s=?aN-1bạn nhận được 'b c ... mật khẩu'; với s =<backtick> và Nbạn nhận được 'a b ... mật khẩu'. SO yêu cầu đầu ra bắt đầu bằng 'a'. Đó là tất cả.
Cary Swoveland

2

Javascript, 73

Đây là phiên bản 73 ký tự của mã @Briguys, chỉ in các kết hợp chữ cái

for(i=s=0;1982613533018>i++;s=i.toString(36))/\d/.test(s)||console.log(s)


2

APL (Dyalog), 46 34

{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '

Về mặt lý thuyết, nó sẽ in cho đến PASSWORD, nhưng tôi đã gặp lỗi toàn bộ không gian làm việc sau khi mảng ZZZZ: 5 chiều quá tuyệt vời.

EDIT: Đã quá lâu kể từ lần cuối tôi chơi với APL. Sao tôi dám bỏ lỡ sự so sánh danh tính ( ) !!!

Giải trình

{...}: Khai báo một hàm mà ...
⎕A∘.,⍵: Đưa sản phẩm bên ngoài qua phép nối (Mọi sự kết hợp của một phần tử của toán hạng bên trái được nối với một phần tử của toán hạng bên phải, giống như Sản phẩm của Cartesian) giữa 26 chữ hoa alpha ( ⎕A) và đối số ( )

{...}¨: Và với mỗi phần tử của tập kết quả, hãy cắm nó vào một hàm ...
⍞←⍵: in nó ra
'PASSWORD '≡ và so sánh với 'PASSWORD '
: Nếu phép so sánh trả về true ( 1), sau đó hủy bỏ chương trình.
: Khác chỉ trả lại chuỗi in.

: Cuối cùng, chức năng bên ngoài tự tái diễn.

. đạt tới PASSWORD kích hoạt việc hủy bỏ)

' ': Tia lửa!! Đó là khởi động chức năng đệ quy với nhân vật không gian.


2

Python 2 - 153 152 151 149 byte

from itertools import*;R=range
for l in iter(chain(*[product(*((map(chr,R(65,91)),)*n))for n in R(1,9)]).next,tuple("passwore")):print ''.join(l)

Đã lưu một byte bằng cách sử dụng UPPERCASE và một byte bằng cách sử dụng dòng mới thay vì dấu cách.


1

Golf 41

Vì thiếu 'z'+1 == 'aa'logic Golfscript không thể thắng cái này.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, tạo mảng từ 0 đến 168036262483
  • (; giảm 0
  • {.. }%lặp đi lặp lại trên mảng
  • 27base chuyển đổi phần tử thành mảng cơ sở 27
  • {96+}% thêm 96 cho mỗi chữ số
  • ' '+ chuyển đổi thành chuỗi và thêm một khoảng trắng vào cuối
  • .96?0<* cắt ngắn chuỗi về 0 nếu nó chứa char 96

1

Trong Ruby, 39 40.

a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}

.. hay 129052722140. (Chỉnh sửa: trước đây tôi đã có 129052722. Tôi đã mất một số chữ số cắt và dán. Hex trước đó ( 0x7B13032) là cho số không chính xác.). Mượn a=?`từ @Doorknob để cứu nhân vật.


Tôi đã cố gắng sửa a=?` nó, nó trông hơi kỳ lạ và có thêm một khoảng trống ở cuối nhưng ít nhất nó cũng hoạt động: P
Doorknob

Vậy số 129052722 đến từ đâu? Theo tính toán của tôi, điều đó dường như sẽ cung cấp cho bạn phạm vi "a" đến "kwkokg" ... hơi nhỏ.
hộp bánh mì

@Breadbox Tôi đã tính số đó bằng phương pháp sau (xin lỗi vì định dạng, nhưng ý kiến ​​có giới hạn, eh?): ORD_BASE_ASCII = 'a'.ord-1; def nbr(word); len = word.size; word.split('').inject(0) {|t,c| offset = c.ord - ORD_BASE_ASCII; t + offset*(26**(len -= 1))}; end Thật dễ dàng để xác nhận điều này là chính xác bằng cách chỉ in ra một số trình tự.
Cary Swoveland

@breadbox Bạn đã đúng. Xem chỉnh sửa. Phương pháp tôi đưa ra trong nhận xét là OK.
Cary Swoveland

Lỗi hàng rào. Kịch bản của bạn đang tính toán bằng cách sử dụng a = 1..z = 26. Bạn cần tính a = 0..z = 25 để có được số đếm đúng. Xóa -1 khỏi dòng đầu tiên, bạn sẽ nhận được 120699639557, (thêm một cho mục nhập zeroth) phù hợp với tính toán của tôi.
hộp bánh mì

1

Javascript: 57 56 ký tự (cảm ơn C5H8NNaO4)

Đây là một giải pháp bao gồm các số có thể có các ký tự ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")

for(i=-1;i++<1982613533017;console.log(i.toString(36)));

Đây là một mẹo nhỏ để thử nghiệm (chỉ với 100 lần lặp cuối cùng để nó không khóa trình duyệt của bạn).


3
Giải pháp này là sai, nó không theo đặc điểm kỹ thuật.
Doorknob

@Doorknob - Vâng, tôi đã đề cập đến điều đó trong câu trả lời của tôi. Nó vẫn in tất cả các trường hợp từ các yêu cầu ban đầu, nhưng cũng in tất cả các trường hợp alpha-số.
Briguy37

Ngoài ra, sau khi đọc lại câu hỏi, nếu tôi đặt i thành 9 trong mã của mình, nó sẽ đáp ứng TẤT CẢ các yêu cầu của câu hỏi ngoại trừ đầu ra ví dụ của anh ta, mà anh ta đã đưa ra một ngoại lệ cho (và nó sẽ đưa mã đến 56 ký tự ).
Briguy37

@ Briguy37 Thông số kỹ thuật nói print every **letter** combinationDù sao đi nữa, hãy lưu một ký tự:{} -> ;
C5H8NNaO4

@ C5H8NNaO4: Giải pháp kết hợp chữ cái nào mà giải pháp của tôi không in? Cảm ơn vì tiền hỗ trợ!
Briguy37

1

Haskell, 101

main=putStrLn.concat.takeWhile(/="passwore ").tail.concat.iterate(\k->[x:y|x<-['a'..'z'],y<-k])$[" "]

0

Befunge (72)

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:" Lr$W~"67++**1+***6+`#@_

In các chuỗi 'a' thành 'mật khẩu' được phân tách bằng dấu cách, sau đó thoát.

Dưới đây là phiên bản chỉ in 9 * 9 = 81 từ đầu tiên ('a' thành 'dd') để so sánh. Các 99*là số lần lặp để thực hiện.

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:99*`#@_

0

JavaScript 80 76

for(i=s=0;s!="password";i++){s=i.toString(36).replace(/[0-9]/,'');console.log(s)}

fiddle - dừng lại ở "pa".

tuy nhiên điều này không lặp lại.


Bạn có thể khởi tạo vòng lặp với i=s=0để lưu thêm ba ký tự.
Ry-

@minitech xong rồi.
làm lạnh toán học

1
Tại sao giữ var ? ilà một toàn cầu trước đây; bây giờ slà một toàn cầu. Bạn chỉ có thể giữ cả hai quả cầu trong mã golf, thường.
Ry-
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.