Das größte Forum im Internet namens postcount ++ hat beschlossen, ein neues Forum-Spiel zu entwickeln. In diesem Spiel besteht das Ziel darin, das Wort zu veröffentlichen, es muss jedoch ein Buchstabe hinzugefügt, entfernt oder geändert werden. Ihr Chef wollte, dass Sie ein Programm schreiben, das das Wort bekommt, und das UNIX-Wörterbuch, während Sie für Unternehmen arbeiten, die intelligentere Foren mit intelligenteren Forenspielen haben und die Konkurrenz zerstören möchten (hey, es ist Ihr Chef, nicht wahr?) Wenn Sie mit ihm sprechen, bekommen Sie ohnehin viel Geld von Ihrem Job.
Ihr Programm erhält zwei Argumente, das Wort und das Wörterbuch. Da der Benutzer, der das Programm verwaltet (ja, ein Benutzer, Ihr Unternehmen verfügt nicht über Ressourcen, um Bots auszuführen), nicht perfekt ist, sollten Sie den Fall in beiden Fällen normalisieren. Die Wörter im Wörterbuch können ASCII-Buchstaben (Groß- und Kleinbuchstaben, die beim Vergleich ignoriert werden sollten), Bindestriche, Apostrophe und nicht aufeinanderfolgende Leerzeichen in der Mitte enthalten. Sie dürfen nicht länger als 78 Zeichen sein. Sie müssen eine Liste von Wörtern ausgeben, die im Spiel akzeptiert werden, um den Spaß von Leuten zu unterbrechen, die manuell an Wörter denken.
Dies ist ein Beispiel für Ihr erwartetes Programm, das nach ähnlichen Wörtern sucht wie golf
.
> ./similar golf /usr/share/dict/words
Goff
Wolf
gold
golfs
goof
gulf
wolf
Dies /usr/share/dict/words
ist eine Liste von Wörtern, nach denen jeweils ein Zeilenumbruch erfolgt. Das kann man zum Beispiel mit fgets () leicht lesen.
Das Unternehmen, in dem Sie arbeiten, verfügt nicht über viele Lochkarten (ja, es ist 2014, und es werden immer noch Lochkarten verwendet). Verschwenden Sie sie also nicht. Schreiben Sie so kurz wie möglich. Oh, und Sie wurden gebeten, keine eingebauten oder externen Implementierungen von Levenshtein distance oder ähnlichen Algorithmen zu verwenden. Etwas über Not Invented Here oder Hintertüren, die anscheinend vom Anbieter in die Sprache eingefügt wurden (Sie haben keine Beweise dafür, sprechen aber nicht mit Ihrem Chef darüber). Wenn Sie also Distanz wollen, müssen Sie diese selbst implementieren.
Sie können jede Sprache verwenden. Selbst mit Lochkarten hat das Unternehmen Zugriff auf modernste Programmiersprachen wie Cobol Ruby oder Haskell oder was auch immer Sie wollen. Sie haben sogar GolfScript, wenn Sie denken, dass es für die Manipulation von Saiten gut ist (ich weiß es vielleicht nicht ...).
Der Gewinner erhält 15 Reputationspunkte von mir und wahrscheinlich viele andere Punkte von der Community. Die anderen guten Antworten erhalten 10 Punkte und auch Punkte von der Community. Sie haben gehört, dass Punkte wertlos sind, aber höchstwahrscheinlich werden sie im Jahr 2050 die Gelehrten ersetzen. Das wurde jedoch nicht bestätigt, aber es ist eine gute Idee, Punkte zu sammeln.
Antworten:
GolfScript, 59 Zeichen
Natürlich eignet sich GolfScript hervorragend zur Manipulation von Saiten!
Was GolfScript nicht so gut kann, ist der Umgang mit Datei-E / A oder Befehlszeilenargumenten. Daher erwartet dieses Programm, dass alle Eingaben über stdin empfangen werden: Die erste nicht leere Zeile wird als Zielwort angenommen, während die verbleibenden Zeilen das Wörterbuch enthalten sollten. Auf einem Unixish-System können Sie diesen Code ausführen, z. B .:
Auf meiner Ubuntu Linux-Box lautet die Ausgabe des obigen Befehls:
Beachten Sie, dass alle Wörter in Kleinbuchstaben umgewandelt werden und alle Duplikate beseitigt werden. Daher listet mine im Gegensatz zu Ihrer Beispielausgabe nicht
Wolf
undwolf
separat auf. Aufgrund Ihrer Beschreibung der Herausforderung gehe ich davon aus, dass dies akzeptabel ist.Außerdem ist der Code sehr langsam, da er einen ziemlich brachialen Ansatz verwendet und nicht einmal offensichtliche Optimierungen wie die Überprüfung, ob die Länge des Kandidatenworts mit der des Zielworts ± 1 übereinstimmt durch die vollständige, ungefilterte
/usr/share/dict/words
Liste in ... ähm ... lass es dich wissen, wenn es fertig ist, OK?Bearbeiten: OK, es dauerte etwa 25 Minuten, aber es wurde beendet.
quelle
Bash + Coreutils, 99 Bytes
Entweder habe ich die Frage völlig falsch verstanden ( die Antwort von @ lambruscoAcido liefert sehr unterschiedliche Ergebnisse ), oder dies ist eine ziemlich einfache Regexp-Anwendung:
Ausgabe:
quelle
${a:b:c}
tun ist?b
aufc
in der Variablena
c
ab der Positionb
( nullbasiert ) der Variablena
. Die Substring-Erweiterung ist eine der Bash-Parameter-ErweiterungenPython 3, 291 Zeichen
Sehr unkompliziert und daher nicht sehr schlau. Aber mit einem großen leckeren Generatorgewirr und optimierter Langsamkeit. Weil Sie Ihre zugewiesene Rechenzeit nicht ungenutzt lassen möchten, oder?
quelle
l=len
undr=range
weiter reduzieren.Scala -
403130[Aktualisiert]: Vollständig aktualisiert, da die vorherige Lösung auch permutierte Buchstaben zulässt. Verwendet kein Regex oder eingebaute Werkzeuge.
Ungolfed:
Verwendung:
quelle
atechny
ändert keinen Buchstaben. Diese Lösung hat nichts mit der Frage zu tun.Python, 174 Zeichen:
Schnell und auf den Punkt.
Beispiel:
Ausgabe:
Ich nehme an, dass die OS X-Wortdatei nur mehr Einträge enthält.
quelle
golf'
.golf'
darin laufen lasse , wird es gedruckt.Haskell - 219
quelle
Rebol - 213
Ungolfed (mit einigen Kommentaren):
Anwendungsbeispiel (getestet in Rebol 3 unter OS X Lion):
Nachfolgend finden Sie die
parse
Regel, die erstellt wurde, um ähnliche Wörter wie Golf zu finden :quelle
Python (103):
Sehr effizient, denke ich. Außerdem gefällt mir, wie gut das in Python gespielt hat.
quelle