diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2014-11-21 20:59:13 +0100 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2014-11-21 20:59:13 +0100 |
| commit | 831d531838e60fc38f5715a3271aa7227d06a6ae (patch) | |
| tree | 131fb7ae11697875241aef597db3ff3263ff039f | |
| parent | 0207f56c2a5c0a8e8e7da82b8caec1b241651089 (diff) | |
| download | bwinf-33-831d531838e60fc38f5715a3271aa7227d06a6ae.tar.gz bwinf-33-831d531838e60fc38f5715a3271aa7227d06a6ae.zip | |
Linting von alphametiken.py
| -rwxr-xr-x | alphametiken.py | 87 |
1 files changed, 52 insertions, 35 deletions
diff --git a/alphametiken.py b/alphametiken.py index 5a864da..d4b25bb 100755 --- a/alphametiken.py +++ b/alphametiken.py @@ -1,36 +1,46 @@ #!/usr/bin/env python3 +'''Generiert oder löst Alphametiken''' # Nicht als root ausführen. -# Die Ausführung dauert bis zu zwei Minuten, abhängig von der Länge des Alphametiks. -# Die Generierung dauert 5 Minuten oder länger. +# Die Ausführung dauert bis zu zwei Minuten, abhängig von der Länge des +# Alphametiks. Die Generierung dauert unter Umständen 5 Minuten oder länger. -# Programm löst das Alphametik "SUCHEN - MACHT = SPASS" und generiert eines mit einem Rechenzeichen +# Programm löst das Alphametik "SUCHEN-MACHT=SPASS" +# und generiert eines mit einem Rechenzeichen import re, random Alphametik = "SUCHEN-MACHT=SPASS" -Zahlen = ["EINS", "ZWEI", "DREI", "VIER", "FÜNF", "SECHS", "SIEBEN", "ACHT", "NEUN", "ZEHN"] +Zahlen = ["EINS", "ZWEI", "DREI", "VIER", "FÜNF", \ + "SECHS", "SIEBEN", "ACHT", "NEUN", "ZEHN"] #Rechenzeichen = ["+", "-", "*", "/"] Rechenzeichen = ["+", "-"] # schneller -# Liste der Buchstaben erstellen aus `wort` def buchstaben_liste(wort): + '''Erstellt eine Liste der Buchstaben''' buchstaben = [] - for c in wort: - if (c not in Rechenzeichen) and (c not in buchstaben) and (c not in " ="): - buchstaben.append(c) + for char in wort: + if (char not in Rechenzeichen) \ + and (char not in buchstaben) \ + and (char not in " ="): + + buchstaben.append(char) return buchstaben -# Ersetzt einen Buchstaben aus `b` in einem Wort `wort` nacheinander durch `0-9` -# und ruft sich selbst auf. Ist `b` leer, wird das Alphametik auf Richtigkeit getestet -# und ggf. zu `lösungen` hinzugefügt. -# Zurückgegeben wird eine Liste mit Lösungen, Element der Liste ist der Rechnungsstring und ein dict -def ersetze(b, wort, benutzte_zahlen = [], lösungen = [], alle_buchstaben = None): +def ersetze(buchst, wort, \ + benutzte_zahlen=[], loesungen=[], alle_buchstaben=None): + '''Ersetzt einen Buchstaben aus `buchst` in einem Wort `wort` \ +nacheinander durch `0-9` und ruft sich selbst auf. \ +Ist `buchst` leer, wird das Alphametik auf Richtigkeit getestet +und ggf. zu `loesungen` hinzugefügt. \ +Zurückgegeben wird eine Liste mit Lösungen. \ +Element der Liste ist der Rechnungsstring und ein dict.''' + if alle_buchstaben == None: - alle_buchstaben = b + alle_buchstaben = buchst - if len(b): + if len(buchst): for j in range(10): if j in benutzte_zahlen: # jede Zahl nur einmal verwenden continue @@ -38,10 +48,12 @@ def ersetze(b, wort, benutzte_zahlen = [], lösungen = [], alle_buchstaben = Non m_benutzte_zahlen = benutzte_zahlen[:] m_benutzte_zahlen.append(j) - m_wort = wort.replace(b[0], str(j)) - ersetze(b[1:], m_wort, m_benutzte_zahlen, lösungen, alle_buchstaben) + m_wort = wort.replace(buchst[0], str(j)) + ersetze(buchst[1:], m_wort, m_benutzte_zahlen, \ + loesungen, alle_buchstaben) else: - if re.search(r"\b0", wort): # 0 als erste Ziffer in einer Zahl ist nicht erlaubt + if re.search(r"\b0", wort): + # 0 als erste Ziffer in einer Zahl ist nicht erlaubt return if eval(wort.replace("=", "==")): @@ -49,27 +61,32 @@ def ersetze(b, wort, benutzte_zahlen = [], lösungen = [], alle_buchstaben = Non for j, k in zip(alle_buchstaben, benutzte_zahlen): lsg[1][j] = k - lösungen.append(lsg) + loesungen.append(lsg) - return lösungen + return loesungen -# kleiner Wrapper, der die Benutzung von `ersetze` vereinfacht -def löse(alpham): +def loese(alpham): + '''kleiner Wrapper, der die Benutzung von `ersetze` vereinfacht''' return ersetze(buchstaben_liste(alpham), alpham, [], [], None) -# gibt ein zufälliges Alphametik mit `länge` "Ziffern" vor dem Gleichheitszeichen zurück -def generiere(länge = 1): +def generiere(laenge=1): + '''gibt ein zufälliges Alphametik mit `laenge` \ +"Ziffern" vor dem Gleichheitszeichen zurück''' while True: rechnung_ok = False while rechnung_ok == False: # sucht nach wahren Gleichungen - alphametik = "x" + "_x" * länge + "=y" # Template für Rechnung + alphametik = "x" + "_x" * laenge + "=y" # Template für Rechnung + + for j in range(laenge + 1): # zufällige Rechenzeichen einsetzen + alphametik = alphametik.replace("_", \ + random.choice(Rechenzeichen), 1) - for j in range(länge + 1): # zufällige Rechenzeichen einsetzen - alphametik = alphametik.replace("_", random.choice(Rechenzeichen), 1) + alphametik = alphametik.replace("y", str(random.randrange(1, 9))) + # Ergebnis - alphametik = alphametik.replace("y", str(random.randrange(1, 9))) # Ergebnis - for j in range(länge + 2): - alphametik = alphametik.replace("x", str(random.randrange(1, 9)), 1) + for j in range(laenge + 2): + alphametik = alphametik.replace("x", \ + str(random.randrange(1, 9)), 1) rechnung_ok = eval(alphametik.replace("=", "==")) @@ -77,17 +94,17 @@ def generiere(länge = 1): for j in range(1, 10): alphametik = alphametik.replace(str(j), Zahlen[j - 1]) - l = löse(alphametik) - if len(l) > 0: + loe = loese(alphametik) + if len(loe) > 0: return alphametik # Geschafft, wir haben eines gefunden! if __name__ == "__main__": - l = löse(Alphametik) + loesung = loese(Alphametik) - if len(l) == 0: + if len(loesung) == 0: print("Keine Lösungen vorhanden") else: print("Es konnten folgende Lösungen gefunden werden:") - print(l) + print(loesung) print(generiere()) |
