def passwort_pruefen(passwort): ''' Prüft die Qualität eines passworts und kann 4 Qualitätsstufen als String zurückgeben; die Prüfung umfasst folgende Punkte: * Länge korrekt len(pw) >= 8? * wenigstens ein Großbuchstabe enthalten? * wenigstens eine Ziffer enthalten? ''' qualitaet = 0 # Ist die Länge korrekt, d. h. >= 8? if len(passwort) >= 8: qualitaet += 1 # Ist wenigstens ein Großbuchstabe enthalten? for a in passwort: if a.isupper(): qualitaet += 1 break # Ist wenigstens eine Zahl enthalten? for a in passwort: if a.isdigit(): qualitaet += 1 break # Rückgabe if qualitaet == 0: return "WEAK" elif qualitaet == 1: return "ACCEPTABLE" elif qualitaet == 2: return "GOOD" else: return "STRONG" passwoerter = ["lizard","aardvark","Aardvark","Aardvark77"] for passwort in passwoerter: # eingabe = input("Enter your password: ") print("Enter your password: {}".format(passwort)) print("This password is {}.\n".format(passwort_pruefen(passwort)))Auch wenn ich aus Bequemlichkeit auf die Eingabe von Passwörtern verzichtet habe und sie aus einer Liste beziehe, bleibt mein Fazit: Keine Herausforderung. Einige andere Aufgaben aus dem Jahr sind schon eine härtere Nuss.
Montag, 11. Februar 2013
Password Analyzer
Ein Passwort hinsichtlich seiner Qualität zu prüfen, wie es bei HP Codewars 2007 (Problem 7) gefordert war, ist keine Herausforderung. Die Funktion war sehr schnell gecodet:
Abonnieren
Kommentare zum Post (Atom)
Schöne Idee mit dem Zähler, aber wesentlich eleganter und kürzer wäre es mit Regular expressions geworden.
AntwortenLöschenSiehe dazu z.B. hier: http://forums.asp.net/t/918584.aspx/1
Danke für den Hinweis! Ich bookmarke mir mal diesen Blogpost und schaue mir das re-Modul noch mal an. Den Code knapper zu formulieren, finde ich interessant; das klingt spannend. Das mit Python zu machen, wäre noch mal eine Herausforderung.
AntwortenLöschenDie `any()`-Funktion kann die Schleifen verkürzen. Man kann zusätzlich den Umstand ausnutzen, dass in Python die Wahrheitswerte von Zahlen abgeleitet sind und man damit rechnen kann. Und statt der ganzen ``if``/``elif``\s könnte man den Qualitätswert als Index in eine Liste mit den Qualitätsstufen verwenden. Das alles in einen Ausdruck gequetscht:
AntwortenLöschendef password_quality(password): return ['WEAK', 'ACCEPTABLE', 'GOOD', 'STRONG'][sum([len(password) >= 0, any(c.isupper() for c in password), any(c.isdigit() for c in password)])]