Wie Sie vielleicht wissen, sind Hacker überall und wollen alles hacken. Sie wurden aufgefordert, Kennwortanforderungen zu stellen, die jeden Hacker stoppen . Das Problem ist, dass Ihr Chef gehört hat, dass es schlecht ist, für LOC zu bezahlen, und er bezahlt Ihnen $ 1800 - $ 0,03 * Zeichen pro Monat, damit Sie die einfachste Sache schreiben, die möglicherweise funktionieren könnte. Sie müssen also eine kleine Anzahl von Zeichen verwenden (hoffentlich sehr klein) oder auf andere Weise das Bargeld vergessen. Außerdem ist es Ihrem Chef egal, welche Sprache Sie verwenden.
Die Anforderungen für gute Passwörter sind ähnlich wie in dem genannten Artikel, außer dass die wörterbuchbasierten Anforderungen entfernt wurden, um zu vermeiden, dass die Lösung von externen Dateien abhängt. Sie müssen nicht überprüfen, ob Buchstaben neu angeordnet werden (schwer zu verstehen, was dies tatsächlich bedeutet) Die letzte Regel wurde entfernt (Was ist 3/4?) und überprüft alte Passwörter nicht.
Die genauen Anforderungen nach dem Entfernen bestimmter Anforderungen aus dem verknüpften Artikel sind:
- habe mindestens 8 Zeichen!
- nicht länger als 12 Zeichen sein!
- habe Groß- und Kleinschreibung!
- habe nicht mehr als 8 Großbuchstaben!
- habe nicht mehr als 8 Kleinbuchstaben!
- Habe mindestens 2 Buchstaben!
- habe einen führenden Brief!
- mindestens 1 Stelle (n) haben!
- Sei nicht dein Benutzername!
- Sei nicht dein Benutzername rückwärts!
- nicht deinen Benutzernamen enthalten!
- nicht rückwärts Ihren Benutzernamen enthalten!
- Du darfst nicht mehr als 1 Paar sich wiederholender Zeichen haben!
- habe nicht 3 Vorkommen desselben Charakters!
- kein Karat enthalten (^)
- kein Leerzeichen enthalten
- nicht enthalten =
- nicht conatain &
- nicht enthalten #
- nicht enthalten ,
- nicht conatain ;
- nicht enthalten "
- nicht enthalten>
- nicht enthalten <
- nicht enthalten [
- nicht enthalten
- nicht enthalten )
Alle Rechtschreibfehler auf dieser Liste wurden so belassen, wie sie sind.
$ ./checkpass
Username: John
Password: L!]E2m69
OK.
$ ./checkpass
Username: John
Password: JohnnhoJ12
Nope.
$ ./checkpass
Username: JOE.smith
Password: JOE!smith123
OK.
Der kürzeste Code gewinnt Geld (als JPG-Datei gesendet). Es muss "Benutzername:" und "Passwort:" anzeigen und mit einer genauen Nachricht antworten.
1
(Ziffer eins) anstelle von ell.Antworten:
Perl,
203194189193 ZeichenHier ist meine Perl-Einstellung zum Problem:
Die regulären Ausdrücke überprüfen, ob das Passwort:
Beginnt mit einem Buchstaben, hat acht bis zwölf Zeichen
enthält eine Ziffer
enthält einen Großbuchstaben
hat acht oder weniger Großbuchstaben
hat acht oder weniger Kleinbuchstaben
enthält einen Kleinbuchstaben
Enthält keine der verbotenen Satzzeichen, drei Vorkommen eines Zeichens, mehr als ein Vorkommen eines doppelten Zeichens, den Benutzernamen oder den umgekehrten Benutzernamen.
(Vielen Dank an Peter Taylor für den Hinweis auf einen Fehler in der 189-Zeichen-Version.)
quelle
use v5.10;
und es scheitert an meinem Testfall "Sind Regexes richtig entkommen". Siehe ideone.com/QKFnZ\Q$u\E|\Q$n
(das letzte\E
kann übersprungen werden, wenn dieser Teil zum Ende verschoben würde).(.)(.*\1.*\1|\1.*(.)\3)
(nicht getestet - ich werde nicht versuchen, eine vollständige Testbatterie mit ideone zu schreiben).Ruby, 270 Zeichen
Eine Ruby-Implementierung basiert auf zwölf regulären Ausdrücken. Jeder Ausdruck ist entweder eine positive Übereinstimmung (die ersten fünf) oder eine negative Übereinstimmung (die letzten sieben). Als Einschränkung darf der Benutzername nur Buchstaben oder Ziffern enthalten.
Positive Übereinstimmungen mit regulären Ausdrücken:
/^.{8,12}$/
: Mindestens 8 Zeichen! Darf nicht länger als 12 Zeichen sein!/\p{Lower}/
und/\p{Upper}/
: Groß- und Kleinschreibung!/^(\p{Alpha}.*){2}/
: habe mindestens 2 Buchstaben !, habe einen Anfangsbuchstaben!/\d/
: mindestens 1 Stelle (n) haben!Übereinstimmungen mit negativen regulären Ausdrücken:
/(\p{Lower}.*){9}/
: habe nicht mehr als 8 Kleinbuchstaben!/(\p{Upper}.*){9}/
: darf nicht mehr als 8 Großbuchstaben enthalten!/(.)\1.*(.)\2/
: darf nicht mehr als 1 Paar sich wiederholender Zeichen enthalten!/(.).*\1.*\1/
: habe nicht 3 Vorkommen des gleichen Charakters!/[ ^=&#,;"<>\[|)]/
: kein Caret, Leerzeichen, =, &, #, ,,; ",>, <, [, |,)/#{u}/
: Sei nicht dein Benutzername! Enthält nicht deinen Benutzernamen!/#{u.reverse}/
: nicht dein Benutzername rückwärts sein !, nicht dein Benutzername rückwärts enthalten!quelle
Python 3, 291 Bytes / Zeichen
Schöner formatiert und kommentiert:
Sie finden diese Lösung auf ideone.com , aber die Ausgabe sieht etwas hässlich aus, da dort keine vordefinierten Eingaben oder sogar Zeilenumbrüche angezeigt werden. Auch die Benutzername-Passwort-Kombination
"JOE.smith"
-"JOE!smith123"
wird derzeit als feste Eingabedaten eingegeben.Ich habe eine Aufschlüsselung aller Prüfungen als Debug-Ausgabe hinzugefügt.
quelle