Erinnern Sie sich an die Brute-Force-Programme, die Kennwörter knacken und alle Kombinationen anzeigen, die sie versuchen? Genauer gesagt, an einem Punkt sind die n ersten Zeichen festgelegt (sie wurden erfolgreich erraten), und jedes mögliche Zeichen für die übrigen Zeichen wird getestet. Wahrscheinlich haben Sie einige in Filmen oder in einer Software gesehen, die von Leuten geschrieben wurde, die ausgefallene Oberflächen mögen.
Es tut uns leid, Sie zu enttäuschen, aber wir werden kein Programm zum Knacken von Passwörtern schreiben, nur eines, um die schöne Ausgabe zu reproduzieren.
Herausforderung
Bei einer Zeichenfolge, die druckbare ASCII-Zeichen, aber keine Zeilenumbrüche enthält (ASCII-Code 32 bis 126 oder mit dem regulären ^[ -~]{2,}$
Ausdruck übereinstimmend ), wird eine Ausgabe nach folgenden Regeln gedruckt:
- Zur Zeit
t=n seconds
sind dien
ersten gedruckten Zeichen dien
ersten Zeichen der Eingabezeichenfolge. - Nach den
n
festen Zeichen sollten Sie eine Zeichenfolge anhängen, die aus einem zufälligen Zeichen besteht (einheitlich pseudozufällig ausgewählt aus dem Unicode-Bereichbis
~
(Code 32 bis 126)), um eine Zeichenfolge mit der Länge der anfänglichen Zeichenfolge zu bilden. - Sie sollten mindestens (dazu später mehr) 20 Zeilen pro Sekunde ausgeben : Jedes von ihnen hat die gleichen
n
ersten Zeichen, aber ein anderes zufälliges Ende.
Es ist wahrscheinlich noch nicht ganz klar, was Sie tun sollen. Lassen Sie uns ein Beispiel durchgehen:
Beispiel
Ich drucke nur 5 verschiedene Zeilen pro Sekunde anstatt der 20 Zeilen, um die Lesbarkeit zu verbessern.
Betrachten Sie die Eingabe abcde
.
Während der ersten Sekunde kann eine gültige Ausgabe so etwas wie (völlig zufällig) sein:
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Dann ist t=1
das erste Zeichen jeder folgenden Zeichenfolge a
(das erste Zeichen der Eingabe):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Nun sind t=2
die ersten beiden Zeichen ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Nun sind t=3
die ersten drei Zeichen abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Nun sind t=4
die ersten vier Zeichen abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Schließlich t=5
drucken wir die Eingabe (nur einmal):
abcde
Ein paar Präzisionen
- Sie sollten sich nicht zu sehr mit der Genauigkeit Ihrer Sprache auf die Sekunden konzentrieren (dh, wenn Ihr Algorithmus korrekt ist, Ihrem System / Ihrer Sprache jedoch die Genauigkeit fehlt, ist dies in Ordnung).
- Die erste Sekunde kann kürzer als eine Sekunde sein (Das heißt, wenn Sie Ihr Programm während einer Sekunde starten, kann die erste Sekunde nur die verbleibende Zeit bis zum Ende der aktuellen Sekunde sein). Oder anders ausgedrückt: Sie müssen nicht auf den Beginn einer neuen Sekunde warten, um mit dem Drucken der Ausgaben zu beginnen.
- Mindestens 20 Zeilen pro Sekunde : Der natürlichere Weg wäre eine Endlosschleife mit einem besonderen Verhalten pro Sekunde (oder einer Zeitüberschreitung oder was auch immer), so dass wahrscheinlich ein paar tausend Zeilen pro Sekunde entstehen (und das ist vollkommen in Ordnung!). ). Wenn Sie jedoch eine andere Idee haben, können Sie sie verwenden, solange Sie mindestens 20 Zeilen pro Sekunde drucken.
- Die Eingabe wird immer länger als 2 Zeichen sein.
- Sie können davon ausgehen, dass die Eingabe nicht länger als 30 Zeichen ist, wenn dies hilfreich ist. (Aber wenn es für längere funktioniert, ist es das Beste)
- Das Eingabeformat sollte die natürlichste Darstellung einer Zeichenfolge in Ihrer Sprache sein.
- Sie dürfen eine abschließende Newline drucken.
Codebeispiel
Wenn Sie immer noch nicht genau wissen, was Sie zu tun haben, können Sie den folgenden Code in einem Linux-Terminal ausführen, um zu sehen:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Gewinnkriterium
Das ist Code-Golf , also gewinnt der kürzeste Code in Byte!
Vielen Dank an Laikoni und Flp.Tkc für ihre Vorschläge und Verbesserungen im Sandkasten.
\r
(wobei sich alle wie in der Animation gegenseitig ersetzen müssen), oder ist dies\n
akzeptabel?\n
ist vollkommen akzeptabel. Die Version mit\r
ist nur hier, weil sie besser aussieht, aber die braucht man nicht\r
.Antworten:
Pyth -
2724 BytesDas sieht eigentlich ziemlich cool aus: D
Probieren Sie es hier online aus (natürlich nicht in Echtzeit, aber wenn Sie mit einer ruhigen Hand nach unten scrollen).
quelle
HTML / JavaScript,
170168167 BytesBearbeiten: 2 Bytes dank @ETHproductions gespeichert. 1 Byte dank @jrich gespeichert.
quelle
setInterval
wird akzeptiert, dass ein String ausgewertet wird, wodurch möglicherweise ein Byte gespart wird.setInterval('o.textContent...',d=50)
speichert die_=>
und fügt ein paar AnführungszeichenKnoten,
145142 BytesDies scheint ein bisschen lang zu sein und es gibt wahrscheinlich ein wenig Raum zum Golfen. Beachten Sie, dass das Semikolon am Ende erforderlich ist. Ohne diesen Befehl gibt das Programm einen Syntaxfehler aus, da die
for
Anweisung keinen Text enthält.Gibt weit mehr als 20 Zeilen pro Sekunde aus; Ein kleiner Piepmatz sagte mir, dass es ungefähr 12 Tausend sind. So sieht es im ConEmu-Terminalemulator auf meinem Computer aus (aufgenommen mit 30 fps):
quelle
05AB1E , 26 Bytes
Ich poste dies als eine andere Antwort in Bezug auf die andere 05AB1E-Antwort, da der Ansatz anders ist
Probieren Sie es online!
quelle
η
.p
õš
š
õ¸ì
¸ì
₂
₂
T·
]
}}
]
BASH,
99 93 92 9188 Bytesmit
tr
+head
+urandom
(Danke an @manatwork)
quelle
[ "$n" = ${#1} ]
→((n==${#1}))
;${1:0:$n}
→${1::n}
<
wird nicht benötigt.((n==${#1}))
->((${#1}-n))
${1::n=SECONDS}
jetzt zu funktionieren scheint.05AB1E, 30 Bytes
Verwendet die CP-1252- Codierung. Probieren Sie es online!
Bitte helfen Sie mir beim Golfspielen.
quelle
C
182176128126125 ByteGolf gespielt:
Ungolfed:
Ich habe gehört, dass es möglich ist, einige StandardsIch bin nur ein Idiot, es funktioniert gut ohne sie.#include
zu löschen, aber ich konnte es nicht auf dem MingW GCC-Compiler zum Laufen bringen, den ich gerade heruntergeladen habe. Konnte auch nicht herausfinden, wie es geht,#define b #include
ohne mehr Platz zu verbrauchen, als es wert war.quelle
a,b,c,d;
da alle so deklarierten globalen Variablen int und init durch 0 sind, auch da Sie nichts zurückgeben, sollten Sie es in main () schreibenwhile(i++<x)
anstelle vonfor (...)
i
muss aber jedes Mal Null sein, wenn die for-Schleife erneut ausgeführt wird.for
ersetzeni <x
miti++<x
und entferneni++
Java 7,
271265207 Bytes-58 Bytes gespart dank @ OliverGrégoire . ( Vergessen Sie nicht, seine noch kürzere Java 8-Antwort zu verbessern. )
Ungolfed:
Eingabe:
abcde
Ausgabe:
quelle
x
:r+=(char)(33+Math.random()*94)
. AuchThread.sleep(9)
um ein Byte zu speichern.r=s.substring(0,i/20)
anstelle der Schleife anj
.r.substring(0,i/20)
(ziemlich dummen von mir) und die(char)(33+Math.random()*94)
(netten Tricks von dir).WinDbg,
400391 Bytes-9 Bytes durch Vereinfachung der Mathematik
Dies scheint definitiv nicht die Aufgabe von WinDbg zu sein. ;)
Die Eingabe erfolgt durch Eingeben einer ASCII-Zeichenfolge an einem Speicherort und Setzen dieser Adresse in das Pseudoregister
$t0
. Z.B:Das von mir verwendete prng ist der Inhalt im Speicher, einige Bytes nach der Eingabezeichenfolge. Chrome.exe scheint den Speicherplatz danach
0x2000000
mit zufällig aussehenden Bytes zu füllen, sodass ich einen Speicherauszug von chrome.exe verwendet habe. Unbekannt, ob dies einheitlich ist, aber für mich eher zufällig aussieht.Wie es funktioniert:
Hinweis: Einige Bytes könnten durch die Verwendung von
j
anstelle von golfen werden.if
, aber das führt dazu, dass es auf meinem Computer zu langsam läuft, sodass nicht mindestens 20 Zeilen pro Sekunde ausgegeben werden und diese Bytes nicht gespeichert werden.Beispielausgabe: http://pastebin.com/H4H74sAx
quelle
R, 138 Bytes
Liest die Eingabe von stdin.
Zählte ungefähr 61 Zeilen auf meinem Computer zwischen jedem zusätzlichen Buchstaben im "Passwort".
quelle
Bash,
247245212207 BytesVielen Dank, Bash, dass du so sensibel für Whitespace bist ...
Die Ausgabe erfolgt in Echtzeit auf separaten Zeilen. Als
.sh
Skript speichern und aufrufen mit:bash <File Name>.sh <Input>
Das
bash Cracking_In_Progress.sh okayerty
Ergebnis ist beispielsweise die folgende Ausgabe, die mit 30 Bildern pro Sekunde aufgezeichnet wurde:quelle
Haskell (GHC), 202 Bytes
-5 Bytes ohne ausgefallene Wagenrücklaufaktion
quelle
>
macht das am Ende der Ausgabe?MATL , 26 Bytes
Probieren Sie es online!
Unten sehen Sie die Echtzeitausgabe des Offline-Compilers. Beachten Sie, dass das animierte GIF mit 20 fps aufgenommen wurde, um seine Größe klein zu halten, die tatsächliche Geschwindigkeit jedoch viel höher ist.
Wie es funktioniert
quelle
Python3,
149141139 BytesEingabe von stdin.
Augenversion (157 Bytes):
quelle
t=time.clock
, aber Sie verwenden t nur einmal im Code. Das Ersetzen durch nurtime.clock
spart 3 Bytes. Dasselbe gilt für den Druck.for _ in range(l-x)
können auchfor _ in"a"*(l-x)
für 2 Bytes sein.print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))
stattprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
Node.js, 134 Bytes
Ähnlich wie @ETHproductions (einige seiner Optimierungen entlehnt), aber ansonsten einen anderen Ansatz. Verwendet Node's
Buffer
, um die Zeichengenerierung anstatt der langwierigen zu handhabenString.fromCharCode
, was den Nebeneffekt hat, dass wirmap
ohne großen Aufwand für die Konvertierung von Zeichenfolgen-> Array-> Zeichenfolgen arbeiten müssen.quelle
Buffer
. Nur damit Sie wissen, werden durch die NeuzuweisungDate
zuD
keine Bytes gespeichert. Ich habe es selbst versucht.Python 3,
167166 BytesLiest die Eingabe von stdin. Eine 171-Byte-Version läuft unter Python 2 (ersetzt
input
durchraw_input
):Ungolfed:
quelle
Dyalog APL ,
5958 BytesLösung
Benötigt,
⎕IO←0
was auf vielen Systemen Standard ist.Anzeige
Wenn Sie das Fenster auf zwei Zeilen einstellen, entsteht die Illusion einer In-Place-Transformation:
Erläuterung
Dies ist ein anonymer Funktionszug, der das Passwort als richtiges Argument verwendet.
⊢⊣
Gib das Passwort zurück und verwerfe das Ergebnis von≢{
...}¨
die folgende Funktion mit der Länge des Passworts als linkem Argument, angewendet auf jedes von2⊃⎕AI
aktuelle Betriebszeit (Lit. drittes Element A ccount I nformations)1E3+
füge eine Sekunde hinzut←
ordne das t zu⊣
entlassen Sie das⍵{
...}⍣{t≤2⊃⎕AI}⍺
wenden Sie die folgende Funktion (mit Unterzeichenfolge als ⍺ und Kennwortlänge als ⍵ ) so oft an, bis die Betriebszeit t erreicht⍵⍴95
95 Wird so oft wiederholt, wie das Kennwort Zeichen enthält?
zufällige ganze Zahl 0 ... 9432+
addiere 32 (was ⍵ zufällige ganze Zahlen im Bereich 32 ... 126 ergibt )⎕UCS
in Unicode-Zeichen konvertieren⍺,
Stellen Sie den aktuell verarbeiteten Teilstring voran⍵↑
Nehmen Sie nur so viele Zeichen, wie im Passwort enthalten sind⎕←
Gib das in einer separaten Zeile aus≢
Liefert die Länge des ausgegebenen Strings (= die Länge des Passworts)⍳∘≢
0 ... Länge-1↑¨
jeder nimmt Zeichen aus⊂
das Passwortquelle
Java, 159 Bytes
Gleicher Algorithmus wie die Antwort von Kevin Cruijssen , nur für Java 8 optimiert.
Ungolfed:
quelle
C #
203197195190 BytesGolf gespielt:
Ungolfed:
l
Speichert die eingegebene Länge.StopWatch
undPath.GetRandomFileName()
sind Teile von .NET Framework.EDIT1: Implizite
Stopwatch
Deklaration.EDIT2:
l
Initialisierung mit Deklaration zusammengeführt.EDIT3: Danke, @Chris.
quelle
t++
kann irgendwo eingefügt werden inif ()
if (w.Elapsed.Seconds > t++)
und entfernent++;
Scala,
259254248233232231227225 BytesUngolfed:
quelle
ForceLang ,
322309 Bytesquelle
C ++ (GCC) ,
280278 BytesProbieren Sie es online!
Es werden nur 20 zufällige Zeichenfolgen gedruckt, die auf 50
std::chrono::milliseconds
Zeilen warten (wodurch genau 20 Zeilen pro Sekunde ausgegeben werden), und dann wird mit dem nächsten "Cracking" -Schritt fortgefahren.quelle
Los , 244 Bytes
Probieren Sie es online! (Schneidet das Ergebnis ab, damit nicht jede Instanz angezeigt wird.)
Dies ist meine erste Golang-Antwort \ o /
(Gefilmt mit 30 Bildern pro Sekunde)
Wie:
quelle
PHP, 222 Bytes
Ungolfed
(Ich weiß, das Video ist Mist)
quelle
$c=range(32,127)
und$r=chr($c[rand(0,94)])
warum dann nicht einfach$r=chr(rand(0,94)+32)
?<?$l=strlen($a=$argv[1]);$e=$l+$s=time();while(time()<=$e&&$o!=$a){$o=substr($a,0,time()-$s);while(strlen($o)<$l)$o.=chr(rand(0,94)+32);echo "$o\n";}
ist 149 Bytes, und ich bin sicher, es kann weiterTcl , 295 Bytes
Erster Golf für mich in Tcl. Keine sehr golferische Sprache, da hier alles wie eine Saite behandelt wird und Leerzeichen normalerweise ein Muss sind ...
Ungolfed:
quelle
-nonewline
denputs
Parameter zu umgehen ?expr
am Ende nicht. man ist genug, und Sie können auch die Leerzeichen um vermeiden>
expr
am Ende an, wie Sie eine verwenden sollen. Ich kann sie nicht sehen.[set k [expr $k-1]]
kann sein[incr k -1]
. Und jedes "<" kann sein<
, keine Leerzeichen erforderlich.Kotlin, 188 Bytes
Golf gespielt
Ungolfed
Das Umbenennen
System.currentTimeMillis
hat einige Bytes gespart!quelle
QBIC ,
9288 BytesIch habe es geknackt!
Dies beruht auf der SLEEP-Funktion von QBasic mit dem Codeliteral
$sleep 1|
und auf derLEFT$
Funktion von QBasic, da ich diese Funktion noch nicht in QBIC implementiert habe ...Es ist gelungen, ein paar Bytes zu kratzen, indem alle für
20
's ersetztt
und auf 20 gesetzt wurden. Außerdem wurde ein Aufruf von random und eine FOR-Schleife optimiert.Erläuterung:
Output (ein Stück aus dem Mittelteil von 'helloworld')
quelle