「パスワード」という単語が見つかるまでブルートフォース文字の組み合わせを実行するプログラムを作成する


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
区切り文字はスペースにする必要がありますか、それとも改行を使用できますか?
イルマリカロネン

はい、できます、それはほんの小さな変更です。
ST3

回答:


32

Perl、19文字

say for a..password

上記の説明に従って、区切り文字として改行を使用します。でperl -M5.010(または単にperl -E 'say for a..password')実行して、Perl 5.10+ say機能を有効にします。メタごとに、これは余分な文字としてカウントされません。

(スペースを区切り文字として主張する場合、$,=$";say a..password2文字だけ長くなります。ただし、印刷前にリスト全体を作成しようとするため、実際には使用できなくなるほどメモリが非常に遅く、無駄になります。)


18

Ruby、33文字(最適ですが、より長いバージョン)

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

私は好き'a'.upto('password')です。それが何をしているかを正確に教えてくれます。Rubyはそのように素晴らしく、表現力豊かです。:D

もちろん、print c,' 'より明確になりますが、使用$>は2文字短くなります。

ルビー、29 25文字(低速版)

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

これは短くなりますが、すべてのトークンを一度に出力するため、実行に長い時間がかかります!


1
素敵な、特に最初の。
ケーリーSwoveland

スローバージョンで(?a..'password').to_aは、短縮できます[*?a..'password']
Paul Prestidge

6

Perl、33 32 24文字

32文字のソリューション:

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

これについて言うことはあまりありません。エントリを区切るためにスペースの代わりに改行を使用できる場合、これを27文字に減らすことができます。

イルマリKaronenは指摘することを..内部的に呼び出します++:より良いソリューション(25文字)をだろうので、

print$_,$"for a..password

Perlのコマンドラインオプションを利用して、同等の24文字のソリューションを以下に示します。

perl -l40e 'print for a..password'

perlフラグをカウントするためのルールは、それらに慣れていない人のためにここにあります。

もちろん、Ilmariの21文字のソリューションはまだ短いですが、129,052,722,140文字列の配列を割り当てることができるマシンが必要です。


.$"代わりに," "キャラクターを保存しませんか?
ラマ氏

うん、私の側の完全な監視。ありがとう。
ブレッドボックス

6

Perl 6、20文字

say "a".../password/

あなたは他のものを必要としません



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文字を除いて、奇妙なものはありません。とにかく、はい、短い単語までテストしました。
ロルタバク

1
@ ST3 からへのテストです。コードパッドのエンコードはISO 8859-1ではないため、空白に置き換える必要がありました。passwoqspassword
lortabac

1
$w<passwore代わりにを使用して文字を保存できます$w!=passwore
まともなダブラー

2

ルビー(40文字)

aの文字列を基数26の数字として解釈します。a= 1、b = 2、...、z = 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を開始したくないですか?
ケーリーSwoveland

あなたが得ているのは、繰り返しのN代わりに使用したことですN-1!ありがとう、私は修正するために編集します。(129052722140があるGoogleに興味深い数が :)。)
アダム・プレスコット

1
0x1e0c2443dbは129052722139と同じ数の文字です。
steenslag

私が意味したのは、if が 'b'` s=?as.succ!始まるということでした。
ケーリーSwoveland

1
s=?aN-1「b c ... password」を取得します。s =<バッククォート>とN、あなたはB「...パスワード」を取得します。SOはで始まる出力を要求しました'a'。それで全部です。
ケーリーSwoveland

2

Javascript、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)、プログラムアボート。
:それ以外の場合は、印刷された文字列を返します。

:最後に、外部関数はそれ自体を再帰します。

(その後、2文字の組み合わせすべてを提供する26アルファと26アルファの間の連結の上で外積を取り、2文字の組み合わせと26アルファの間の連結の上で外積を取ります...中止をトリガーするパスワードに到達)

' ': スパーク!!それはスペース文字で再帰関数をキックスタートします。


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バイトを節約しました。


1

Golfscript 41

欠如のために'z'+1 == 'aa'ロジックGolfscriptは、この1を獲得することはできません。

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, 0から168036262483の配列を作成します
  • (; 0を落とす
  • {.. }%配列の繰り返し
  • 27base 要素をベース27配列に変換します
  • {96+}% 各桁に96を加算します
  • ' '+ 文字列に変換し、末尾にスペースを追加します
  • .96?0<* 文字96が含まれている場合、文字列をゼロに切り捨てます

1

Rubyでは、39 40。

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

..or 129052722140。(編集:以前は持っていました129052722。切り取りと貼り付けの数字をいくつか失っていました。前のヘックス(0x7B13032)は間違った数字のためでした。)a=?`@Doorknobから借用してキャラクターを保存します。


私はそれを修正しようとしましたa=?` 、それはちょっと奇妙に見え、最後に余分なスペースがありますが、少なくとも動作します:P
Doorknob

では、番号129052722はどこから来たのでしょうか?私の計算では、それはあなたに "a"から "kwkokg"の範囲を与えるように思えます...少し小さいです。
ブレッドボックス

@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あなたは正しかった。編集を参照してください。私がコメントで与えた方法はOKです。
ケーリーSwoveland

フェンスポストエラー。スクリプトはa = 1..z = 26を使用して計算しています。正しいカウントを得るには、a = 0..z = 25を計算する必要があります。最初の行から-1を削除すると、120699639557が得られます(0番目のエントリに1を追加)と、計算に一致します。
ブレッドボックス

1

Javascript: 57 56文字(C5H8NNaO4に感謝)

これは、可能な文字として数字を含むソリューションです(「0」、「1」、「2」、..、「passwor9」、「passwora」、「passworb」、「passworc」、「password」)

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

ここにテスト用のフィドルがあります(最後の100回の反復のみで、ブラウザーがロックされないようにします)。


3
この解決策は間違っており、仕様に従っていません。
ドアノブ

@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」から「password」を出力し、終了します。

以下は、比較のために最初の9 * 9 = 81ワード( 'a'から 'dd')のみを出力するバージョンです。99*実行する反復回数です。

<_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)}

フィドル -「pa」で停止します。

ただし、これは繰り返します。


ループを初期化して、i=s=0さらに3文字を保存できます。
Ry-

@minitech完了。
数学チラー

1
なぜ維持するのvarですか?i以前はグローバルでした。今sはグローバルです。通常、コードゴルフでは両方のグローバルを保持できます。
Ry-
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.