Der Domänenserver erfordert, dass alle Mitarbeiter ein sicheres, zufälliges Kennwort haben, das den folgenden Regeln entspricht:
- Genau 15 Zeichen lang.
- Nur Zeichen, die über die Tastatur eingegeben werden können (siehe Code-Typ unten). Es ist nicht gestattet, den Verkäufern die Verwendung von ALT + NUMPAD-Codes beizubringen.
- Mindestens 1 Kleinbuchstabe:
abcdefghijklmnopqrstuvwxyz
- Mindestens 1 Großbuchstabe:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- Mindestens 1 Ziffer:
0123456789
- Mindestens 1 Symbol:
`~!@#$%^&*()_+-={}|[]\:";'<>?,./
Zu diesem Zweck hat die IT einen Zufallskennwortgenerator in Auftrag gegeben, der an alle Mitarbeiter verteilt wird. Alle Mitarbeiter müssen den Zufallspasswortgenerator verwenden. Die Anforderungen für den Zufallspasswortgenerator sind zusätzlich zu den obigen Passworteinschränkungen:
- Es muss in der Lage sein, alle Permutationen aller zulässigen Zeichen zu generieren.
- Es muss das generierte Passwort auf dem Bildschirm anzeigen.
- Der Code muss so klein wie möglich sein (in Byte).
Bitte reichen Sie Ihren Lösungsvorschlag innerhalb der nächsten Woche ein.
correcthorsebatterystaple
Antworten:
Mathematica (18)
Lass mich ein bisschen schummeln
PS nicht Sicherheit :)
quelle
Ruby,
74 bis69 BytesNur zufällig aus dem ASCII-Bereich 33 - 126 auswählen, bis alle Zeichenklassen vorhanden sind:
Ruby, 39 Bytes
Mit Elchs kluger Entdeckung:
Bearbeiten, um den Mob zu befriedigen:
Beachten Sie, dass sich die Regeln geändert haben, nachdem ich dies zum ersten Mal gepostet habe. Zu diesem Zeitpunkt galten beide vorherigen Einträge für die Regeln. Ich möchte auch darauf hinweisen, dass die Regeln noch nicht zu genau definiert sind:
"Permutationen". Es gibt keine Permutationen der zulässigen Zeichen, die den übrigen Regeln entsprechen, da jede Permutation des Satzes zulässiger Zeichen so lang ist wie der Satz zulässiger Zeichen selbst (während das Kennwort 15 Zeichen lang sein soll). Und es gibt keine Wiederholungen in einer Permutation. Mein erster Eintrag ist jedoch immer noch "zufälliger" als viele der anderen gut bewerteten Antworten hier.
Trotzdem hast du es hier. Ermöglicht Wiederholungen von Zeichen und Unterstrichen:
Ruby, 77 Bytes
Ich habe auch
puts
anstelle vonp
in diesem verwendet, weilp
die Zeichenfolge in "Anführungszeichen" gedruckt und einige Zeichen mit einem Backslash maskiert werden.Ruby, 70 Bytes
Wie Ventero betont,
~
kann vor den Regexen übersprungen undprint
ersetzt werdenputs$_
. Aber mit der hässlichen Ausgabe können Sie genauso gut alle abgelehnten Passwörter ausdrucken und sie zu einem Einzeiler zusammenfassen:Erläuterung
Wie gewünscht.
$_
ist eine semi-magische Variable, die die letzte Zeile gelesen vom Eingang enthält - so dass Sie es nicht immer brauchen zu speichern, wie diese . Hier verwenden wir es jedoch wegen einer anderen Eigenschaft, nämlich dass der~
Operator einen regulären Ausdruck direkt darauf anwendet, ein Trick, den ich zuerst durch chron gelernt habe . Ich habe die Verwendung von ersetztall
, aber es sollte ziemlich einfach zu verstehen sein, wenn Sie den Rest bekommen ( siehe die Dokumentation ).quelle
.all?{|r|~r}
das? Was macht$_=
das?\W
Ruby den Unterstrich_
? In den meisten Regex-Dialekten weiß ich, dass dies nicht der Fall ist. Und wenn Ihr Code keine Passwörter generieren könnte, bei denen ein einzelnes_
das einzige nicht alphanumerische Symbol ist, würde dies eine Anforderung verletzen. Der zweite Ansatz verstößt offensichtlich gegen diese Anforderung, aber ich glaube, er war zu diesem Zeitpunkt nicht richtig formuliert.\W
enthält keinen Unterstrich in Perl-kompatiblem RegEx ( Quelle ).sample
Elemente nicht wiederholt, sodass Passwörter mit wiederholten Elementen nicht von Ihrem Code generiert werden können. Können Sie diese beiden Probleme beheben, damit Ihre Antwort der Frage entspricht? Angesichts der Tatsache, dass Ihre Lösung mit Ausnahme von Wolfram Alpha die führende ist, wäre es schön zu sehen, ob Sie sich anpassen und die Führung behalten können. Ich denke, es sollte nicht zu schwer sein.Java 8 -
354329319275267 ZeichenNur zum Spaß, mit Lambdas mit Java 8 - jede mögliche Ausgabe hat die gleiche Wahrscheinlichkeit, gefunden zu werden.
Dabei wird die Tatsache ausgenutzt, dass die zulässigen Zeichen fortlaufende ASCII-Codes von 33 bis 126 haben.
Beispielausgabe:
Komprimiertes Programm:
class A{static int a,A,d,p;public static void main(String[]x){String s;do{s=new String(new java.util.Random().ints(15,33,127).toArray(),0,15);a=A=d=p=0;s.chars().map(c->c>96&c<123?a=1:c>64&c<90?A=1:c>47&c<58?d=1:(p=1)).min();}while(a+A+d+p<4);System.out.println(s);}}
quelle
while(a+A+d+p<4)
zusammena|=1
statta++
? Oder verwenden Sie Bitmasken, also solche wiea|=1
Througha|=8
, mita<15
als Schleifenbedingung. Das spart weitere 13 Zeichen, wenn ich richtig gezählt habe.new String(int[],int,int)
sparen Sie weitere 40 Zeichen!Python 2.X + 3.X (229 Zeichen): Generieren und ersetzen
Idee
r
durch eine zufällige Ziffers
mits != r
, von einem GroßbuchstabenCode
Python 2.X + 3.X (194 Zeichen): Generieren und prüfen
\u
und\l
in Python Regex nicht existiert.random.sample
dies ersatzlos ist.Mit Fehler in der Problembeschreibung
Derzeit verlangt die Problembeschreibung nicht, dass jedes Symbol / jede Ziffer mit derselben Wahrscheinlichkeit erscheint. Mit der folgenden Lösung können Sie keine Annahme über ein einzelnes Symbol und / oder eine Position treffen. Aber Sie können es mit mehreren tun.
Python 2.X + 3.X (62 Zeichen)
Danke an daniero für die Idee sample zu verwenden.
quelle
\l
usw. für Python-Regexes dokumentiert? Sehen Sie es nicht in der Referenz . Mein Python 3.3.3 akzeptiert nicht einmal"\u"
. Dasstr(…)
fügt die Buchstaben in 3.3.3 oder 2.7.6 nicht hinzu. Ein Vorschlag für Feld - Optimierung:all(s("\\"+i,p)for i in "dluW")
.random.sample
Wählt ersatzlose Elemente aus, sodass nicht alle Passwörter möglich sind.\u
und bin nur für\l
Vim.Bash on * nix (109)
Damit dies korrekt funktioniert,
$a
darf im Voraus kein gültiges, aber nicht zufälliges Kennwort festgelegt werden. Wenn Sie einschließena=
und eine Zeile voranstellen möchten, sind das drei weitere Zeichen, aber Sie können das Ding wiederholt ausführen. Sie können natürlich auch alle Zeilenumbrüche durch neue ersetzen,;
sodass Sie einen Einzeiler haben, den Sie so oft ausführen können, wie Sie möchten.Darüber hinaus sollten Sie
LC_ALL=C
(LANG
undLC_CTYPE
insbesondere) länderspezifische Umgebungsvariablen festgelegt oder nicht festgelegt haben , da die Zeichenbereiche davon abhängen, dass die Sortierreihenfolge der ASCII-Reihenfolge entspricht./dev/urandom
ist eine Quelle für zufällige Bytes.!-~
ist der Bereich aller zulässigen Zeichen, wie in der Frage angegeben.tr -dc
Entfernt alle Zeichen, die nicht im nächsten Argument aufgeführt sind.head
Nimmt 15 der verbleibenden Zeichen.grep
prüft, ob jede der erforderlichen Arten mindestens einmal vorkommt. Die Eingabe besteht aus vier Kopien des Kandidaten. Die Reihenfolge der Symbole spielt also keine Rolle. Daher haben alle möglichen Passwörter eine Chance, ausgewählt zu werden. Das-q
to grep unterdrückt die Ausgabe.Aus unbekannten Gründen,
/dev/random
anstatt/dev/urandom
ewig zu dauern. Es scheint, als wäre die Entropie ziemlich schnell erschöpft. Wenn Siecd
Lust haben/dev
, können Sie weitere Bytes vermeiden, aber das fühlt sich ein bisschen wie Schummeln an.Python 2 (138)
Um den Code lesbar zu machen, habe ich nach der Schleife eine neue Zeile und einen Einzug eingefügt, die nicht erforderlich sind und die ich nicht gezählt habe.
Dies ist im Wesentlichen die gleiche Idee wie in der Bash-Version. Die zufällige Quelle ist hier
random.sample
, die Elemente nicht wiederholt. Um diesem Umstand entgegenzuwirken, verwenden wir 15 Exemplare der Liste der zulässigen Buchstaben. Auf diese Weise kann jede Kombination auftreten, auch wenn solche mit wiederholten Buchstaben seltener vorkommen. Aber ich entscheide mich, dies als Feature und nicht als Bug zu betrachten, da die Frage nicht für alle Permutationen die gleiche Wahrscheinlichkeit erforderte, sondern nur die Möglichkeit.Python 3 (145)
Eine neue Zeile und ein neuer Einzug werden nicht gezählt. Abgesehen von etwas Python-3-spezifischem Syntax-Overhead ist dies die gleiche Lösung wie für Python 2.
JavaScript (161)
Ich habe die Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt, aber nicht gezählt.
R (114)
Zeilenumbruch und Einrückung in der Schleife hinzugefügt, aber nicht gezählt. Wenn Sie Lust dazu haben, können Sie dies wieder in eine einzelne
;
Zeile verschieben.quelle
grepl
in Ihrem R-Code verwendet haben könnten . Wenn ich nur daran gedacht hätte, das Testkennwort viermal zu wiederholen, damit Sie alle Überprüfungen in einem Schritt durchführen könnten. Und wenn ich nur ansample
und gedacht hätteintToUtf8
. Sie müssen jedoch Ihre Beispielmethodereplace=TRUE
(oder genauer gesagt, Sie müssen sie nur hinzufügen,T
), um sicherzustellen, dass Sie alle möglichen Kennwörter erhalten.replace=T
Fehler behoben , danke , dass du darauf hingewiesen hast . EsintToUtf8
hat eine ganze Weile gedauert, bis ich herausgefunden habe, ob es sich um einen Namen mit Tabulatorkomplettierung handelt. Ich wusste, dass eine solche Funktion existieren muss, aber die gebräuchlicheren Namen wiechr
usw. wurden nicht verwendet.*4
? Ich dachte, Ihre Regex würde mit jeder Zeichenfolge übereinstimmen, mit dieser Anzeige zuerst ein Großbuchstabe, dann irgendetwas, dann ein Kleinbuchstabe, als irgendetwas ... Was habe ich falsch gemacht?re.search
nichtre.match
der Fall ist, sodass der reguläre Ausdruck möglicherweise an einer beliebigen Stelle im Kennwort des Kandidaten übereinstimmt. Erklärt dies, warum es irgendwann endet?re.search
statt verwendenre.match
. Das erklärt es. Aber ich denke immer noch, dass du das nicht brauchst*4
. Vielen Dank für die Erklärung (+1)C # (
123 - 139103 - 127 Zeichen komprimiert):Verwendung einer vollkommen adäquaten Framework-Methode in
System.Web.dll
:Verdichtet:
Beispiel:
Alternativ können Sie den Wert des zweiten Parameters (
int numberOfNonAlphanumericCharacters
) von der Befehlszeile übernehmen:quelle
GeneratePassword
unterstützt nicht alle in der Frage angegebenen Symbole. Ich habe auch keine Garantie für die minimale Anzahl der Vorkommen der einzelnen Charakterkategorien gefunden.class P
und weiter komprimierenstring[] a
.R (
301322 Zeichen)Korrektur vergessen, nach Ziffern zu suchen.
(Leerzeichen nur zur Verdeutlichung hinzugefügt).
Erzeugt alle möglichen 15-Zeichen-Permutationen der 94 Zeichen. Wählen Sie dann eine zufällig aus, bis sie den Kriterien entspricht.
Die Magie liegt in der
q:q
Operation, die einen neuen Faktordatentyp erzeugt, der die Wechselwirkung aller Faktoren in der erstenq
Liste mit allen Faktoren in der zweiten Liste darstellt , wobei jede mögliche Kombination dieser beiden Listen in der Liste von "" enthalten ist. Ebenen "dieses Faktors. Interagieren Sie 15 Kopien der Liste der zulässigen Zeichen, und Sie erhalten (94 ^ 15) mögliche Ebenen.Bitte versuchen Sie dies nicht zu Hause. Es dauert ein paar Sekunden, bis der Code alle drei Permutationen ermittelt hat. Ich kann mir wirklich nicht vorstellen, wie lange es dauern würde, bis alle 15 Permutationen ermittelt sind, wenn auf Ihrem Computer nicht einfach der Speicher im Speicher ausgeht inzwischen. Als ich das fertige (dreistellige Passwort) Skript ausführte, um es zu überprüfen, war das erste Passwort, das es ausspuckte, "oO =", was meiner Meinung nach die Reaktion zusammenfasst, die Sie auf diesen Code haben sollten.
quelle
Mathematica 170
Beispiele
Pg3 / e? 3 + Z ~ Oz
X / 8jWe @ f (_x5P: =
2wz2VQhtJC? * R7 ^
quelle
Python 2.7 (182)
quelle
join
irgendwie muss da sein: Würde Benutzer erwartet werden Python - Liste Syntax von dem Ausgang zu verstehen:['q', 'u', ...]
?aA$bc1111111111
) nicht möglich sind.Golfscript (60)
Da die Obl. golfscript fehlt und als noob brauche ich sowieso die übung :)
Es wird lediglich ein Array mit den 4 erforderlichen + 11 zufälligen Zeichen erstellt und in zufälliger Reihenfolge sortiert.
quelle
{r}$
. Das ist eine ziemlich schmutzige Art, eine Liste zu mischen - ich mag es! ;-)0Aa~~~~~~~~~~~~
. :-(JavaScript
258240233225Verwenden einer Regel, bei der:
function(x){return x*x}
kann umgeschrieben werden alsfunction(x)x*x
. Scheint nur für Funktionen zu funktionieren, die einen Wert zurückgeben.Nächste Iteration, reduziert
x.sort(function().5-R())
aufx.sort(y=>.5-R())
Nächste Iteration, weiter reduziert mit fetter Pfeilnotation, die leider nur für Firefox 22 und höher funktioniert.
quelle
JavaScript (269 Zeichen komprimiert)
Aus Gründen der Übersichtlichkeit ist dies der Code, bevor ich ihn in JS-Fiddle komprimiert habe :
Hier ist es auf 269 Zeichen komprimiert ( JS-Fiddle davon ):
quelle
shuffle()
einer "benutzerdefinierten Funktion" ? Ist es Teil von JavaScript oder Code, den Sie selbst schreiben müssten?Clojure (63):
Es muss jedoch verbessert werden, um sicherzustellen, dass mindestens 1 Zeichen jeder Kategorie (Oberes, Unteres, Ziffer, Symbol) enthalten ist.
quelle
In SQL-Server
Sehen Sie es in Aktion - 1
sehen Sie es in Aktion - 2
quelle
~0Aa
, oder ein Passwort, aufb
das "" folgta
.SAS (191)
*TQP,(f=h10*)S=
Kommentiert / eingerückt:
quelle
PowerShell: 119
Gofled Code
Nicht golfen und kommentiert
quelle
^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$
Sie können eine Übereinstimmung mit dieser machen, die nur dann übereinstimmt, wenn es ein oberes, unteres, Ziffer, Symbol gibt.1aZ%
und(p3R
überein? Ich hatte einige Schwierigkeiten, online Möglichkeiten dafür zu finden.$x-cmatch'^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$'
Gute Übereinstimmungen:C>suD1?hTwbDx(z
j%4O]HyeG|u[U$5
O/rGeD0$hJk=GO/
Fehlgeschlagene Übereinstimmungen:3evthX3_X^nBrR`
.nA ~ uYzrR4YV-r.`u-IjZE48ntQ;HxV
Python 2.7 (149)
Besser lesbar (und nicht ausführbar) geschrieben;
Ziemlich unkompliziert und überraschenderweise nicht viel länger als eine "Generiere, versuche es erneut bei einem Match-Fehler" -Version.
quelle
0Aa~~~~~~~~~~~~
? (Beachten Sie das'~' == chr(126)
.)PSQL (189)
Fühlt sich an wie PSQL ist ein bisschen wortreich ... :)
SQLfiddle Demo .
quelle
PHP,
235225Dieses Skript mischt die Zeichen und überprüft dann über RegEx, ob das Kennwort sicher ist (oder neu generiert wird).
quelle
while(true) ... if (condition) break
können Siewhile (!condition)
Javascript (209)
Semi-ungolfed;
quelle
Perl, 92
Nicht so prägnant wie die Ruby-Antwort, aber ich bin sicher, dass ein Perl-Assistent dies noch kürzer machen könnte ... Ich bin mit all den
m//
s am Ende nicht allzu glücklich , scheint aber zu funktionieren und sollte die Bedingungen erfüllen, um schließlich zu generieren alle Permutationen.Beispielnutzung:
Bearbeitet, um die Validierung
[[:punct:]]
zu[\W_]
korrigieren und nach MvG-Kommentaren zu wechseln.quelle
aaaaaaaaaaaaaa
die Schleife beenden. Sie sollten Kriterien mit nicht zufälligen Passwörtern testen, um sicherzustellen, dass sie genau das tun, was Sie möchten.[[:punct:]]
? Ich würde, which is shorter and of which I'm even more sure that it is correct, at least combined with your
wohl den Bereich "[\ W_] 33..127 " vorziehen.\W
dies nicht enthalten ist_
, aber Sie haben absolut Recht, es wird nicht benötigt: gist.github.com/anonymous/8301237 . Danke!Java 7 (
270234 Zeichen)Die Voraussetzung ist die gleiche, die von @assylias mit Java 8 verwendet wird (generieren Sie zufällige Passwörter, bis ein gültiges Passwort vorliegt). Anstatt Lambdas zu verwenden, wird das Kennwort jedoch durch Iteration eines char-Arrays generiert und durch Abgleichen eines regulären Ausdrucks überprüft.
Minimierter Code:
quelle
Power Shell
One Liner Version (143 Bytes)
Mini-Version (146 Bytes)
Lesbare Version (860 Bytes)
quelle
abcd1234ABCD{|}~
wird nie angezeigt, da$symbol
mindestens eines der Symbole zwischen ASCII 33 und 47 liegen muss.$SR
, vielleicht$Q
?(g(65..90))
sein,65..90|g'. And change the
Dinge wie foreach` Anweisungenforeach-object
mit dem%
Alias in Schleifen zu schneiden . Beispiel:foreach($N in (1..11)){
...}
sollte machbar wie1..11|%{
...}
. Ich bin mir ziemlich sicher, dass andere Optimierungen möglich sind, aber ich habe tatsächlich eine ganz andere Implementierung im Sinn, die ich später versuchen möchte.Faktor 196 Zeichen
Gleicher Algorithmus wie bei MvG und Elch. Es ist nicht das kürzeste, sollte aber alle (aktuellen) Kriterien in der Frage erfüllen:
quelle
~{}|1234abcdABCD
wird den regulären Ausdruck scheitern."~{}|1234abcdABCD" 60 cycle "[A-Z].*[a-z].*[0-9].*[\\W_]" findall empty? not => t
C - 154 Zeichen
Wie ich hasse
srand()
? Lass mich die Wege zählen.quelle
Haskell, 192
Die gedruckte Zeichenfolge ist in Anführungszeichen gesetzt und enthält keine umgekehrten Schrägstriche und Anführungszeichen. Wenn das nicht akzeptabel ist,
print
kann es durchputStrLn
3 weitere Bytes ersetzt werden. Hier ist eine besser lesbare Version:Es ist ganz einfach, es erstellt nur eine unendliche / träge Liste von zufälligen ASCII-Zeichen im Bereich
'!'
bis'~'
und wirft dann das erste Element aus, bis die ersten 15 Zeichen mindestens ein Zeichen aus jeder Zeichenfolge der erforderlichen Zeichen enthalten.quelle
Excel VBA, 209 Bytes
Generiert zufällig 15 ASCII-Zeichen, sodass alle möglichen Kombinationen möglich sind. Verwendet dann ein Muster mit regulären Ausdrücken, um zu überprüfen, ob es mindestens eines der einzelnen Kriterien enthält.
Wenn dies der Fall ist, wird das Passwort angezeigt, wenn dies nicht der Fall ist, wird "Redo" angezeigt.
Wir danken Bart Kiers für das Muster des regulären Ausdrucks: https://stackoverflow.com/questions/1559751/regex-to-make-sure-dass-der-String- mindestens-niedrigere- Fallzeichen- enthält Oberer, höher
quelle
AutoHotkey 352
Verwenden - Führen Sie einfach das Skript aus
quelle
Python (121 Zeichen)
Nutzt die Tatsache, dass Sie Listen in Python multiplizieren können [1,2,3] * 2 ergibt [1,2,3,1,2,3]. Importiert zufällig. Zahlen in einer Liste, multipliziert mit drei, sind Grenzen zwischen Bereichen in der ASCII-Tabelle für benötigte Zeichen, z. B. [65, 90] Maps für Großbuchstaben.
quelle
import random
im Code enthalten sein.PHP 5.5 (230 Bytes)
Oder in einer Zeile (211 Bytes)
quelle