summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2014-11-21 20:59:13 +0100
committerschneefux <schneefux+commit@schneefux.xyz>2014-11-21 20:59:13 +0100
commit831d531838e60fc38f5715a3271aa7227d06a6ae (patch)
tree131fb7ae11697875241aef597db3ff3263ff039f
parent0207f56c2a5c0a8e8e7da82b8caec1b241651089 (diff)
downloadbwinf-33-831d531838e60fc38f5715a3271aa7227d06a6ae.tar.gz
bwinf-33-831d531838e60fc38f5715a3271aa7227d06a6ae.zip
Linting von alphametiken.py
-rwxr-xr-xalphametiken.py87
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())