단어 "password"가 발견 될 때까지 무차별 대입 문자 조합을 수행하는 프로그램을 작성하십시오.


16

프로그램은 모든 문자 조합 (소문자 또는 대문자, 중요하지 않음)을 알파벳 순서로 인쇄해야합니다. 로 시작해야 a하며 마지막 인쇄 조합은입니다 password.

출력은 다음과 같아야합니다.

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
구분 기호는 공백이어야합니까, 아니면 줄 바꿈을 사용할 수 있습니까?
Ilmari Karonen

예, 가능합니다. 사소한 변경 일뿐입니다.
ST3

답변:


32

펄, 19 문자

say for a..password

위의 설명에 따라 줄 바꾸기를 구분 기호로 사용합니다. 으로 실행 perl -M5.010(또는 perl -E 'say for a..password'펄 5.10+ 수 있도록) say기능을. meta 당 , 이것은 추가 문자로 계산되지 않습니다.

(구분자를 공백으로 고집하면 $,=$";say a..password두 문자가 더 길어집니다. 그러나 인쇄하기 전에 전체 목록을 메모리에 작성하려고 시도하기 때문에 실제로는 사용할 수 없을 정도로 매우 느리고 메모리가 낭비됩니다.)


18

루비, 33 자 (최적이지만 더 긴 버전)

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

나는 ~을 좋아한다 'a'.upto('password'). 정확히 무엇을하고 있는지 알려줍니다 . 루비는 위대하고 표현력이 뛰어납니다.:D

물론 print c,' '훨씬 더 명확하지만 사용하는 $>것이 두 글자 짧습니다.

루비, 29 25 자 (느린 버전)

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

이것은 더 짧지 만 모든 토큰을 한 번에 인쇄하므로 실행하는 데 오랜 시간이 걸립니다!


1
특히 처음입니다.
Cary Swoveland

느린 버전에서는 다음과 (?a..'password').to_a같이 단축 할 수 있습니다.[*?a..'password']
Paul Prestidge

6

펄, 33 32 24 자

32 자 솔루션 :

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

이것에 대해 말할 것도 많지 않습니다. 공백 대신 줄 바꿈을 사용하여 항목을 분리 할 수 ​​있다면 이것을 27 자로 줄일 수 있습니다.

Ilmari Karonen..내부적으로 호출 ++하므로 더 나은 솔루션 (25 자)은 다음과 같습니다.

print$_,$"for a..password

Perl의 명령 행 옵션을 활용하여 동등한 24 자 솔루션을 제공합니다.

perl -l40e 'print for a..password'

펄 플래그를 세는 규칙 은 여기에 익숙하지 않은 사람들을위한 것입니다.

물론 Ilmari의 21 자 솔루션 은 여전히 ​​짧지 만 129,052,722,140 개의 문자열 배열을 할당 할 수있는 기계가 필요합니다.


.$"대신 ," "문자 를 저장 하지 않겠습니까 ?
Mr. Llama

그렇습니다. 감사.
breadbox

6

펄 6, 20 자

say "a".../password/

다른 것들이 필요하지 않습니다


5

파이썬 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 자

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

인코딩을 ISO 8859-1로 설정하고 경고를 비활성화해야합니다.


나는 그것을 테스트하지 않았지만 실제로 그렇게합니까?
ST3

@ ST3 간단한 루프입니다. 변수 $w는 처음에 'a'로 설정되고 'password'다음의 첫 번째 값에 도달 할 때까지 증가합니다 (마지막 문자열은 인쇄되지 않음).
lortabac

3
@ ST3 규칙적인 for루프입니다. 비트 반전 된 공백 인 마지막 2자를 제외하고이 코드에는 이상한 것이 없습니다. 어쨌든, 나는 그것을 더 짧은 단어까지 테스트했습니다.
lortabac

1
@ ST3 에서 까지 의 테스트 입니다 . 코드 패드 인코딩이 ISO 8859-1이 아니기 때문에 공백 으로 바꿔야 했습니다. passwoqspassword
lortabac

1
$w<passwore대신에 문자를 저장할 수 있습니다 $w!=passwore.
Decent Dabbler

2

루비 (40 자)

a = 1, b = 2, ..., z = 26을 사용하여 az 문자의 문자열을 밑수 26의 숫자로 해석하십시오.

따라서 "암호"는 숫자 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)

우리가 s = "a"(즉, 1)을 보내고 (N-1)을 호출하면 s.succ!s는 "password"(N)이됩니다. 즉, N = 1 + (N-1)입니다.

더 빠르게 실행되는 예제의 경우 N 계산이 올바른지 확인하려면 다음을 고려하십시오. "pass" N이

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

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

인쇄하고 싶기 때문에 "a" 너무, 우리는 필요

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

전체 "암호"로 돌아가십시오. N = 129052722140, 떠나기 :

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

좀 더 컴팩트 한 형태를 129052722140 == 0x1e0c2443db찾았지만 찾을 수 없었습니다.

"a"Cary 덕분 에 인쇄 부족 문제를 해결하도록 업데이트되었습니다 .


1
아담, 당신은 내 마음에 녹아 있었을 것입니다. 'a'이전에 s를 시작하고 싶지 않습니까?
캐리 스월 랜드

나는 당신이 얻는 것이 내 반복 N대신에 사용했다고 생각합니다 N-1! 감사합니다. 수정하도록 수정하겠습니다. (129052722140은 Google에 흥미로운 숫자 이지만 ) :
Adam Prescott

1
0x1e0c2443db는 129052722139. 많은 문자로 그냥
steenslag

내가 의미하는 바는 'b' s=?a에서 s.succ!시작한다는 것입니다.
Cary Swoveland

1
s=?a그리고 N-1당신은 'C ... 비밀번호 B'얻을; 와 s =<역 따옴표>와 N당신이 얻을 'A B ... 비밀번호'. SO는 출력을로 시작하도록 요청했습니다 'a'. 그게 다야.
Cary Swoveland

2

자바 스크립트, 73

다음은 문자 조합 만 인쇄하는 @Briguys 코드의 73 자 버전입니다.

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


2

APL (Dyalog), 46 34

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

이론적으로는 PASSWORD까지 인쇄되지만 ZZZZ 후 작업 공간 전체 오류가 발생했습니다. 5 차원 배열이 너무 훌륭합니다.

편집 : 내가 APL을 마지막으로 피 들린 이후로 너무 오래 있었어야합니다. 내가 어떻게 신분 비교를 놓쳤는가 ( ) !!!

설명

{...}:
⎕A∘.,⍵26 개의 대문자 알파 ( ⎕A)와 인수 ( )

{...}¨: 생성 된 세트의 각 요소에 해당 플러그 ... 함수에 대한
⍞←⍵: 인쇄 그것을
'PASSWORD '≡함께 비교 'PASSWORD '
: 비교 결과 (true를 반환하는 경우 1), 다음 프로그램 중단.
: 그렇지 않으면 인쇄 된 문자열 만 반환합니다.

: 마지막으로 외부 함수가 반복됩니다.

(그러면 26 알파와 26 알파 사이의 concat보다 외부 제품을 가져 와서 모든 2 문자 조합을 제공 한 다음 2 문자 조합과 26 알파 사이에서 concat보다 외부 제품을 가져옵니다. 중단을 유발하는 비밀번호에 도달)

' ': 스파크!! 공백 문자로 재귀 함수를 시작합니다.


2

파이썬 2 - 153 152 151 149 바이트

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)

대문자 대신 공백을 사용하지 않고 줄 바꿈을 사용하여 1 바이트를 절약했습니다.


1

골프 스크립트 41

부족 'z'+1 == 'aa'논리 Golfscript이 하나를 이길 수 없다.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, 0에서 168036262483 사이의 배열을 만듭니다.
  • (; 0을 내려
  • {.. }%배열을 반복
  • 27base 요소를 기본 27 배열로 변환
  • {96+}% 각 자리에 96을 더하다
  • ' '+ 문자열로 변환하고 끝에 공백을 추가하십시오.
  • .96?0<* char 96이 포함되어 있으면 문자열을 0으로 자릅니다.

1

루비, 39 40.

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

.. 또는 129052722140. (편집 : 이전에는 129052722. 잘라 내고 붙여 넣은 자릿수를 잃어 버렸습니다. 이전 16 진수 ( 0x7B13032)는 잘못된 숫자입니다.) 빌린 a=?`문자를 저장에 @Doorknob에서.


나는 a=?` 물건 을 고치려고 노력했다 , 그것은 다소 이상해 보이고 끝에 여분의 공간이 있지만 적어도 그것은 작동한다 : P
Doorknob

129052722는 어디에서 왔습니까? 내 계산에 따르면, 그것은 당신에게 "a"에서 "kwkokg"의 범위를 줄 것입니다 ... 약간 작습니다.
breadbox

@Breadbox 나는 다음과 같은 방법으로 그 수를 계산했습니다 (서식은 죄송하지만 주석에는 한계가 있습니다) ?: 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 일부 시퀀스를 인쇄하여 이것이 올바른지 쉽게 확인할 수 있습니다.
캐리 Swoveland

@breadbox 당신이 옳았습니다. 편집을 참조하십시오. 내가 언급 한 방법은 괜찮습니다.
Cary Swoveland

펜스 포스트 오류. 스크립트는 a = 1..z = 26을 사용하여 계산합니다. 올바른 수를 얻으려면 a = 0..z = 25를 계산해야합니다. 첫 번째 줄에서 -1을 제거하면 120699639557이 표시되며 (0 번째 항목에 1을 더함) 내 계산과 일치합니다.
breadbox

1

자바 스크립트 : 57 56 자 (감사합니다 C5H8NNaO4)

가능한 문자 ( "0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")로 숫자를 포함하는 솔루션이 있습니다.

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

다음은 테스트를위한 바이올린입니다 (마지막 100 회 반복으로 브라우저를 잠그지 않습니다).


3
이 솔루션은 잘못되었으며 사양을 따르지 않습니다.
Doorknob

@Doorknob-예, 나는 대답에서 언급했습니다. 여전히 원래 요구 사항의 모든 사례를 인쇄하지만 모든 영숫자 사례도 인쇄합니다.
Briguy37

또한 질문을 다시 읽은 후 코드에서 i를 9로 설정하면 예제 예외를 제외하고는 모든 질문의 요구 사항을 충족합니다. ).
Briguy37

@ Briguy37 사양에 따르면 print every **letter** combination어쨌든 문자를 저장하십시오.{} -> ;
C5H8NNaO4

@ C5H8NNaO4 : 솔루션에서 어떤 문자 조합이 인쇄되지 않습니까? 팁 고마워!
Briguy37

1

하스켈, 101

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

0

베 펀지 (72)

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

문자열 'a'를 공백으로 구분 된 '암호'로 인쇄 한 다음 종료합니다.

아래는 비교를 위해 처음 9 * 9 = 81 단어 ( 'a'~ 'dd') 만 인쇄하는 버전입니다. 을 99*수행하는 반복 횟수이다.

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

0

자바 스크립트 80 76

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

바이올린 - "pa"에서 멈 춥니 다.

그러나 이것은 일을 반복합니다.


i=s=0세 개의 문자를 더 저장하기 위해 루프를 초기화 할 수 있습니다 .
Ry-

@minitech 완료.
Math chiller

1
왜 유지 var? i전에는 세계적이었다. 지금 s은 세계적입니다. 일반적으로 두 전역을 코드 골프로 유지할 수 있습니다.
Ry-
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.