Python :: Aufgabe #183 :: Lösung #1

2 Lösungen Lösungen öffentlich
#183

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ß!
#1
vote_ok
von Gisbert5020 (3120 Punkte) - 03.07.2018 um 10:42 Uhr
Quellcode ausblenden Python-Code
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_()

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2094297

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.