Schreiben Sie ein Programm, das eine Brute-Force-Buchstabenkombination ausführt, bis das Wort "Passwort" gefunden wird

16

Das Programm sollte jede Buchstabenkombination (Kleinbuchstaben oder Großbuchstaben, es spielt keine Rolle) in alphabetischer Reihenfolge drucken. Es muss mit beginnen aund die letzte gedruckte Kombination sollte sein password.

Die Ausgabe sollte sein:

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
ST3
quelle
2
Müssen die Trennzeichen Leerzeichen sein, oder kann ich Zeilenumbrüche verwenden?
Ilmari Karonen
Ja, das ist nur eine kleine Änderung.
ST3

Antworten:

32

Perl, 19 Zeichen

say for a..password

Verwendet Zeilenumbrüche als Begrenzer (siehe Erläuterung oben). Führen Sie mit perl -M5.010(oder nur perl -E 'say for a..password') aus, um die Perl 5.10+ say-Funktion zu aktivieren . Per Meta zählt dies nicht als zusätzliche Zeichen.

(Wenn Sie auf Leerzeichen als Begrenzer bestehen, $,=$";say a..passwordsind diese Zeichen nur zwei Zeichen länger. Sie sind jedoch auch sehr langsam und speicherintensiv, sodass sie in der Praxis unbrauchbar werden, da vor dem Drucken versucht wird, die gesamte Liste im Speicher zu erstellen.)

Ilmari Karonen
quelle
18

Ruby, 33 Zeichen (optimale aber längere Version)

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

Ich mag das 'a'.upto('password'); es sagt dir genau, was es tut. Ruby ist so großartig und ausdrucksstark.:D

Wäre natürlich print c,' 'auch viel übersichtlicher, aber mit $>zwei Zeichen kürzer.

Ruby, 29 25 Zeichen (langsame Version)

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

Dieser ist kürzer, aber es werden alle Token gleichzeitig gedruckt, daher dauert die Ausführung sehr lange!

Türknauf
quelle
1
Schön, vor allem der erste.
Cary Swoveland
In der langsamen Version (?a..'password').to_akann um [*?a..'password']
Paul Prestidge 30.09.13
6

Perl, 33 32 24 Zeichen

Eine Lösung in 32 Zeichen:

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

Dazu gibt es nicht viel zu sagen. Ich könnte dies auf 27 Zeichen reduzieren, wenn ich anstelle von Leerzeichen Zeilenumbrüche verwenden könnte, um die Einträge zu trennen.

Ilmari Karonen weist darauf hin, dass ..interne Anrufe ++, also eine bessere Lösung (25 Zeichen) wäre:

print$_,$"for a..password

Im Folgenden finden Sie eine Lösung mit 24 Zeichen, die die Befehlszeilenoptionen von Perl nutzt:

perl -l40e 'print for a..password'

Die Regeln zum Zählen von Perl-Flags sind hier für diejenigen, die mit ihnen nicht vertraut sind.

Natürlich ist die 21-Zeichen-Lösung von Ilmari noch kürzer, aber es ist ein Computer erforderlich, der ein Array von 129.052.722.140 Zeichenfolgen zuordnen kann.

Brot-Box
quelle
Würde nicht .$"stattdessen ," "einen Charakter speichern?
Mr. Llama
Ja, totales Versehen meinerseits. Vielen Dank.
Brotkasten
6

Perl 6, 20 Zeichen

say "a".../password/

Sie brauchen keine anderen Dinge

Demayl
quelle
5

Python 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
Feersum
quelle
4

PHP 38 37 36 Zeichen

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

Sie müssen die Kodierung auf ISO 8859-1 einstellen und Warnungen deaktivieren.

lortabac
quelle
Ich habe das nicht getestet, aber macht es das wirklich ???
ST3
@ ST3 Es ist eine einfache Schleife. Die Variable $wwird anfänglich auf 'a' gesetzt und dann inkrementiert, bis sie den ersten Wert nach 'password' erreicht (die letzte Zeichenfolge wird nicht gedruckt).
Lortabac
3
@ ST3 Es handelt sich um eine reguläre forSchleife. Dieser Code enthält nichts Seltsames, mit Ausnahme der letzten zwei Zeichen, bei denen es sich um ein bitweise invertiertes Leerzeichen handelt. Wie auch immer, ja, ich habe es bis zu einem kürzeren Wort getestet.
Lortabac
1
@ ST3 Hier ein Test von passwoqsbis password. Da die Codierung von Codepad nicht ISO 8859-1 ist, musste ich durch ein Leerzeichen ersetzen .
Lortabac
1
Sie können ein Zeichen mit $w<passworeanstelle von speichern $w!=passwore.
Decent Dabbler
2

Ruby (40 Zeichen)

Interpretieren Sie eine Folge von z Buchstaben als Zahl in Basis 26 mit a = 1, b = 2, ..., z = 26.

"Passwort" kann man sich also als die Zahl N = vorstellen

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

Wenn wir s = "a"(das heißt: 1) lassen und (N-1) anrufen, s.succ!ist s "password"(N). Mit anderen Worten ist N = 1 + (N-1).

Um zu beweisen, dass die Berechnung von N korrekt ist, betrachten Sie für ein Beispiel, das schneller ausgeführt wird, "pass"als das Ziel, wo N ist

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

und

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

Da wir auch drucken wollen "a", brauchen wir

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

Also zurück zum vollen "Passwort". N = 129052722140, Verlassen:

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

Ich suchte nach einer kompakteren Form 129052722140 == 0x1e0c2443db, konnte aber keine finden.

(Aktualisiert, um den Mangel an Druck zu beheben "a", dank Cary.)

Adam Prescott
quelle
1
Adam, das musst du gewesen sein. Willst du nicht, dass wir eins vor 'a' beginnen?
Cary Swoveland
Ich denke, was du meinst, ist, dass ich es in meinen Iterationen Nanstelle von verwendet N-1habe! Danke, ich werde das Problem beheben. (Obwohl 129052722140 eine interessante Nummer für Google ist :).)
Adam Prescott
1
0x1e0c2443db ist genauso viele Zeichen wie 129052722139.
Steenslag
Was ich meinte war, dass wenn s=?a, s.succ!bei "b" beginnt.
Cary Swoveland
1
Mit s=?aund erhalten N-1Sie 'b c ... password'; mit s =<backtick> und Ndu bekommst 'ein b ... Passwort'. Der SO forderte zunächst die Ausgabe an 'a'. Das ist alles.
Cary Swoveland
2

Javascript, 73

Hier ist eine 73-stellige Version des @ Briguys-Codes, in der nur Buchstabenkombinationen gedruckt werden

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

C5H8NNaO4
quelle
2

APL (Dyalog), 46 34

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

Theoretisch würde es bis zum PASSWORT gedruckt, aber nach ZZZZ ist ein Fehler aufgetreten: 5-dimensionales Array ist einfach zu großartig.

EDIT: Muss zu lange her sein, seit ich das letzte Mal mit APL rumgespielt habe. Wie konnte ich es wagen, den Identitätsvergleich zu verpassen ( ) !!!

Erläuterung

{...}: Deklariert eine Funktion, die ...
⎕A∘.,⍵: das äußere Produkt die Verkettung übernimmt (jede Kombination eines Elements des linken Operanden, das mit einem Element des rechten Operanden verkettet ist, genau wie das kartesische Produkt) zwischen den 26 Großbuchstaben alpha ( ⎕A) und dem Argument ( )

{...}¨: Und für jedes Element der Ergebnismenge stecken Sie das in eine Funktion, die ...
⍞←⍵: es ausgibt
'PASSWORD '≡und vergleicht mit 'PASSWORD '
: Wenn der Vergleich true ( 1) ergibt , brechen Sie das Programm ab.
: Andernfalls geben Sie einfach die gedruckte Zeichenfolge zurück.

: Endlich kehrt die äußere Funktion von selbst zurück.

(Dann nehmen Sie das äußere Produkt über Concat zwischen dem 26-Alpha und dem 26-Alpha, was alle 2-Buchstaben-Kombinationen ergibt, und dann das äußere Produkt über Concat zwischen den 2-Buchstaben-Kombinationen und dem 26-Alpha usw. ... Bis Sie PASSWORT erreichen, das den Abbruch auslöst)

' ': Der Funke!! Dieser Kick-Start der rekursiven Funktion mit dem Leerzeichen.

TwiNight
quelle
2

Python 2 - 153 152 151 149 Bytes

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)

Ein Byte mit GROSSBUCHSTABEN und ein Byte mit Zeilenumbrüchen anstelle von Leerzeichen gespeichert.

Pfeffer
quelle
1

Golfscript 41

Aus 'z'+1 == 'aa'logischen Gründen kann Golfscript diesen nicht gewinnen.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, Array von 0 bis 168036262483 erstellen
  • (; lass die 0 fallen
  • {.. }%über Array iterieren
  • 27base Element in Basis-27-Array konvertieren
  • {96+}% Addiere 96 zu jeder Ziffer
  • ' '+ In Zeichenfolge konvertieren und am Ende ein Leerzeichen einfügen
  • .96?0<* Verkürzen Sie den String auf Null, wenn er das Zeichen 96 enthält
aaaaaaaaaaa
quelle
1

In Ruby, 39 40.

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

..oder 129052722140. (Edit: Früher hatte ich 129052722. Ich hatte einige Ziffern beim Ausschneiden und Einfügen verloren. Vorherige hex ( 0x7B13032) war für falsche Nummer.). Entlehnt a=?`aus @Doorknob , um ein Zeichen speichert.

Cary Swoveland
quelle
Ich habe versucht a=?` , das Problem zu beheben , es sieht irgendwie komisch aus und hat am Ende ein zusätzliches Leerzeichen, aber zumindest funktioniert es: P
Türklinke
Woher kommt also die Nummer 129052722? Nach meiner Berechnung scheint Ihnen das den Bereich "a" bis "kwkokg" zu geben ... ein bisschen klein.
Brotkasten
@Breadbox Ich habe diese Zahl mit der folgenden Methode berechnet (Entschuldigung für die Formatierung, aber Kommentare haben Einschränkungen, wie?): 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 Es ist einfach zu bestätigen, dass dies korrekt ist, indem Sie nur einige Sequenzen ausdrucken.
Cary Swoveland
@breadbox Du hattest recht. Siehe Bearbeiten. Die Methode, die ich im Kommentar angegeben habe, ist OK.
Cary Swoveland
Zaunpfostenfehler. Ihr Skript berechnet mit a = 1..z = 26. Sie müssen a = 0..z = 25 berechnen, um die richtige Anzahl zu erhalten. Wenn Sie -1 aus der ersten Zeile entfernen, erhalten Sie 120699639557, was (durch Hinzufügen einer Eins für den nullten Eintrag) meiner Berechnung entspricht.
Brotkasten
1

Javascript: 57 56 Zeichen (danke C5H8NNaO4)

Hier ist eine Lösung, die Zahlen als mögliche Zeichen enthält ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")

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

Hier ist eine Übung zum Testen (mit nur den letzten 100 Iterationen, damit Ihr Browser nicht blockiert).

Briguy37
quelle
3
Diese Lösung ist falsch, sie entspricht nicht der Spezifikation.
Türklinke
@Doorknob - Ja, das habe ich in meiner Antwort erwähnt. Es werden weiterhin alle Fälle aus den ursprünglichen Anforderungen gedruckt, es werden jedoch auch alle alphanumerischen Fälle gedruckt.
Briguy37
Wenn ich die Frage nach dem erneuten Lesen auf 9 setze, würde sie ALLE Anforderungen der Frage erfüllen, mit Ausnahme der Beispielausgabe, für die er bereits eine Ausnahme festgelegt hat (und würde den Code auf 56 Zeichen bringen ).
Briguy37
@ Briguy37 Die Spezifikation sagt print every **letter** combinationsowieso, speichere einen Charakter:{} -> ;
C5H8NNaO4
@ C5H8NNaO4: Welche Buchstabenkombination druckt meine Lösung nicht? Danke für den Tipp!
Briguy37
1

Haskell, 101

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

Befunge (72)

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

Gibt die Zeichenfolgen 'a' bis 'password' aus, die durch Leerzeichen getrennt sind, und wird dann beendet.

Unten finden Sie eine Version, die nur die ersten 9 * 9 = 81 Wörter ('a' bis 'dd') zum Vergleich ausgibt. Dies 99*ist die Anzahl der durchzuführenden Iterationen.

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

JavaScript 80 76

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

Geige - stoppt bei "pa".

Dies wiederholt jedoch die Dinge.

Mathekühler
quelle
Sie können die Schleife mit initialisieren i=s=0, um drei weitere Zeichen zu speichern.
Ry
@minitech erledigt.
Math Chiller
1
Warum das behalten var? iwar ein globales vor; Jetzt sist eine globale. Normalerweise können Sie beide Globals im Codegolf behalten.
Ry