프로그램은 모든 문자 조합 (소문자 또는 대문자, 중요하지 않음)을 알파벳 순서로 인쇄해야합니다. 로 시작해야 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
프로그램은 모든 문자 조합 (소문자 또는 대문자, 중요하지 않음)을 알파벳 순서로 인쇄해야합니다. 로 시작해야 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
답변:
say for a..password
위의 설명에 따라 줄 바꾸기를 구분 기호로 사용합니다. 으로 실행 perl -M5.010
(또는 perl -E 'say for a..password'
펄 5.10+ 수 있도록) say
기능을. meta 당 , 이것은 추가 문자로 계산되지 않습니다.
(구분자를 공백으로 고집하면 $,=$";say a..password
두 문자가 더 길어집니다. 그러나 인쇄하기 전에 전체 목록을 메모리에 작성하려고 시도하기 때문에 실제로는 사용할 수 없을 정도로 매우 느리고 메모리가 낭비됩니다.)
?a.upto('password'){|c|$><<c+' '}
나는 ~을 좋아한다 'a'.upto('password')
. 정확히 무엇을하고 있는지 알려줍니다 . 루비는 위대하고 표현력이 뛰어납니다.:D
물론 print c,' '
훨씬 더 명확하지만 사용하는 $>
것이 두 글자 짧습니다.
$><<[*?a..'password']*' '
이것은 더 짧지 만 모든 토큰을 한 번에 인쇄하므로 실행하는 데 오랜 시간이 걸립니다!
(?a..'password').to_a
같이 단축 할 수 있습니다.[*?a..'password']
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 개의 문자열 배열을 할당 할 수있는 기계가 필요합니다.
.$"
대신 ," "
문자 를 저장 하지 않겠습니까 ?
<?for($w=a;$w<passwore;)echo$w++,~ß;
인코딩을 ISO 8859-1로 설정하고 경고를 비활성화해야합니다.
$w
는 처음에 'a'로 설정되고 'password'다음의 첫 번째 값에 도달 할 때까지 증가합니다 (마지막 문자열은 인쇄되지 않음).
for
루프입니다. 비트 반전 된 공백 인 마지막 2자를 제외하고이 코드에는 이상한 것이 없습니다. 어쨌든, 나는 그것을 더 짧은 단어까지 테스트했습니다.
$w<passwore
대신에 문자를 저장할 수 있습니다 $w!=passwore
.
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 덕분 에 인쇄 부족 문제를 해결하도록 업데이트되었습니다 .
N
대신에 사용했다고 생각합니다 N-1
! 감사합니다. 수정하도록 수정하겠습니다. (129052722140은 Google에 흥미로운 숫자 이지만 ) :
s=?a
에서 s.succ!
시작한다는 것입니다.
s=?a
그리고 N-1
당신은 'C ... 비밀번호 B'얻을; 와 s =
<역 따옴표>와 N
당신이 얻을 'A B ... 비밀번호'. SO는 출력을로 시작하도록 요청했습니다 'a'
. 그게 다야.
{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '
이론적으로는 PASSWORD까지 인쇄되지만 ZZZZ 후 작업 공간 전체 오류가 발생했습니다. 5 차원 배열이 너무 훌륭합니다.
편집 : 내가 APL을 마지막으로 피 들린 이후로 너무 오래 있었어야합니다. 내가 어떻게 신분 비교를 놓쳤는가 ( ≡
) !!!
{...}
:
⎕A∘.,⍵
26 개의 대문자 알파 ( ⎕A
)와 인수 (⍵
)
{...}¨
: 생성 된 세트의 각 요소에 해당 플러그 ... 함수에 대한
⍞←⍵
: 인쇄 그것을
'PASSWORD '≡
함께 비교 'PASSWORD '
→
: 비교 결과 (true를 반환하는 경우 1
), 다음 프로그램 중단.
⍵
: 그렇지 않으면 인쇄 된 문자열 만 반환합니다.
∇
: 마지막으로 외부 함수가 반복됩니다.
(그러면 26 알파와 26 알파 사이의 concat보다 외부 제품을 가져 와서 모든 2 문자 조합을 제공 한 다음 2 문자 조합과 26 알파 사이에서 concat보다 외부 제품을 가져옵니다. 중단을 유발하는 비밀번호에 도달)
' '
: 스파크!! 공백 문자로 재귀 함수를 시작합니다.
루비, 39 40.
a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}
.. 또는 129052722140
. (편집 : 이전에는 129052722
. 잘라 내고 붙여 넣은 자릿수를 잃어 버렸습니다. 이전 16 진수 ( 0x7B13032
)는 잘못된 숫자입니다.) 빌린 a=?`
문자를 저장에 @Doorknob에서.
a=?`
물건 을 고치려고 노력했다 , 그것은 다소 이상해 보이고 끝에 여분의 공간이 있지만 적어도 그것은 작동한다 : P
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
일부 시퀀스를 인쇄하여 이것이 올바른지 쉽게 확인할 수 있습니다.
가능한 문자 ( "0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")로 숫자를 포함하는 솔루션이 있습니다.
for(i=-1;i++<1982613533017;console.log(i.toString(36)));
다음은 테스트를위한 바이올린입니다 (마지막 100 회 반복으로 브라우저를 잠그지 않습니다).
print every **letter** combination
어쨌든 문자를 저장하십시오.{} -> ;
for(i=s=0;s!="password";i++){s=i.toString(36).replace(/[0-9]/,'');console.log(s)}
바이올린 - "pa"에서 멈 춥니 다.
그러나 이것은 일을 반복합니다.
i=s=0
세 개의 문자를 더 저장하기 위해 루프를 초기화 할 수 있습니다 .
var
? i
전에는 세계적이었다. 지금 s
은 세계적입니다. 일반적으로 두 전역을 코드 골프로 유지할 수 있습니다.