Python :: Aufgabe #183
2 Lösungen

Programmierung eines Anagramm-Generators
Fortgeschrittener - Python
von hollst
- 31.05.2018 um 14:02 Uhr
Unter einem (vollständigen) Anagramm eines Basiswortes versteht man
sinnvolle Wörter, die aus den gleichen Buchstaben wie
das Basiswort zusammengesetzt sind. Z. B. sind zum Basiswort TOR die Wörter
ROT und ORT Anagramme. Die Folge OTR ist kein Anagramm (kein sinnvolles Wort).
Für den zu programmierenden Anagramm-Generator, der ein Basiswort entgegennehmen
und eine Liste sinnvoller Anagramme ausgeben soll (Bild 1), wird natürlich eine
Liste aller sinnvollen Wörter einer (natürlichen) Sprache benötigt. Mein Vorschlag
ist es, sich den Textfile germany.dic von
https://sourceforge.net/projects/germandict/
herunterzuladen. Er enthält knapp 2.000.000 Einträge "sinnvoller" deutscher Wörter,
darunter auch eines meiner Lieblingswörter:
Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz.
Dieses Wort steht in der Tat sogar im Duden, allerdings nur an Stelle zwei der Wurmwörter,
den ersten Platz hat
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung.
Ja, aber das nur zum Schmunzeln am Rande. Viel Spaß!
sinnvolle Wörter, die aus den gleichen Buchstaben wie
das Basiswort zusammengesetzt sind. Z. B. sind zum Basiswort TOR die Wörter
ROT und ORT Anagramme. Die Folge OTR ist kein Anagramm (kein sinnvolles Wort).
Für den zu programmierenden Anagramm-Generator, der ein Basiswort entgegennehmen
und eine Liste sinnvoller Anagramme ausgeben soll (Bild 1), wird natürlich eine
Liste aller sinnvollen Wörter einer (natürlichen) Sprache benötigt. Mein Vorschlag
ist es, sich den Textfile germany.dic von
https://sourceforge.net/projects/germandict/
herunterzuladen. Er enthält knapp 2.000.000 Einträge "sinnvoller" deutscher Wörter,
darunter auch eines meiner Lieblingswörter:
Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz.
Dieses Wort steht in der Tat sogar im Duden, allerdings nur an Stelle zwei der Wurmwörter,
den ersten Platz hat
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung.
Ja, aber das nur zum Schmunzeln am Rande. Viel Spaß!
Lösungen:

import sys import datetime from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QLabel, \ QListWidget, QHBoxLayout, QVBoxLayout, QLineEdit, QMessageBox import itertools from bisect import bisect_left class Fenster(QWidget): def __init__(self, parent=None): super(Fenster, self).__init__(parent) self.komponenten() self.verbindungen() self.layout() def komponenten(self): self.laden = QPushButton("Wörterbuch laden") self.eingabe = QLineEdit() self.suchen = QPushButton("Suchen") self.suchen.setEnabled(False) self.anzeige = QLabel("Rechenzeit 00:00:00") self.listwidget=QListWidget() def verbindungen(self): self.laden.clicked.connect(self.openWoerterbuch) self.suchen.clicked.connect(self.permutation) def layout(self): self.hlayout = QHBoxLayout() self.vlayout = QVBoxLayout() self.hlayout.addWidget(self.laden) self.hlayout.addWidget(self.eingabe) self.hlayout.addWidget(self.suchen) self.hlayout.addWidget(self.anzeige) self.vlayout.addLayout(self.hlayout) self.vlayout.addWidget(self.listwidget) self.setLayout(self.vlayout) def openWoerterbuch(self): file = open("german.dic") self.woerterBuch = [] for line in file: self.woerterBuch.append(line.rstrip().upper()) file.close() self.woerterBuch.sort() self.suchen.setEnabled(True) self.laden.setEnabled(False) def suche(self, x, anfang=0, ende=None): if ende == None: ende = len(self.woerterBuch)-1 position = bisect_left(self.woerterBuch, x, anfang, ende) return position def permutation(self): text = self.eingabe.text() if len(text) > 11: msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setInformativeText("Wort hat mehr als 11 Stellen") msg.setWindowTitle("Sicherheitsabfrage") #msg.setDetailedText("The details are as follows:") msg.setStandardButtons(QMessageBox.Cancel) msg.exec_() return start = datetime.datetime.now() self.listwidget.clear() permstupel = set(list(itertools.permutations(self.eingabe.text().upper()))) liste = [] for i in permstupel: liste.append(''.join(i)) liste.sort() anfang=0 #letzte Permutation im Wörterbuch suchen. ende=self.suche(liste[len(liste)-1]) for p in liste: position = self.suche(p, anfang, ende) if p == self.woerterBuch[position]: self.listwidget.addItem(p) anfang = position self.listwidget.addItem("fertig") end = datetime.datetime.now() self.anzeige.setText("Rechenzeit: " + str(end-start)) if __name__ == '__main__': app = QApplication(sys.argv) fenster=Fenster() fenster.show() app.exec_()
Eigentlich kein Anagrammgenerator sondern eher ein Anagrammsucher, aber wozu auch einen Haufen Permutationen berechnen wenn es eh nur um die im Wörterbuch vorhandenen Anagramme geht.
Python-Code

#!/usr/bin/python # -*- coding: iso-8859-15 -*- def zaehle(buchstabe,anzahl): if buchstabe in anzahl: anzahl[buchstabe] = anzahl[buchstabe]+1 else: anzahl[buchstabe] = 1 def wortzaehl(wort): #Buchstaben zählen und als dictonary-Variable zurückgeben anzahl={} for buchstabe in wort: zaehle(buchstabe.upper(),anzahl) return anzahl while 1: print("Zum Beenden: kein Wort eingeben und Return drücken") eingabe=input("Bitte Wort eingeben für welches Anagramme gesucht werden sollen: ") eingabe=eingabe.rstrip() if eingabe=="": break eingabezaehl=wortzaehl(eingabe) wbfile = open("german.dic", "r") #german.dic von https://sourceforge.net/projects/germandict/ for line in wbfile: line=line.strip(" \t\n\r") if eingabe.upper()==line.upper():continue if eingabezaehl==wortzaehl(line): print(line) wbfile.close print("---keine weiteren Anagramme gefunden---") print() print("Ich hoffe es hat geholfen! Bye,Bye!")