Johnny versucht Kreuzworträtsel zu erstellen, aber er hat Schwierigkeiten, Wörter aufeinander abzustimmen.
Er hat sich mehrere einfache Wortrechtecke ausgedacht: dh Wortgruppen, die ein Rechteck bilden, wobei alle horizontalen und vertikalen Pfade ein Wort bilden.
//2x2
PA
AM
//2x3
GOB
ORE
//3x3
BAG
AGO
RED
//3x4
MACE
AGES
WEES
Um ein gutes Puzzle zu erstellen, benötigt er jedoch einige Wortrechtecke, die etwas größer als 3x4 sind. Anstatt sich stundenlang über die Arrangement-Briefe zu quälen, würde Johnny es vorziehen, ein Programm zu haben, das dies für ihn erledigt - und zwar in möglichst wenigen Zeichen, da lange Codeblöcke für Gelegenheitsprogrammierer wie Johnny äußerst einschüchternd sind.
Gegeben
- ein Textdatei- Wörterbuch, in dem Wörter durch Zeilenumbrüche in alphabetischer Reihenfolge getrennt sind;
- Eingabe unter Angabe der Anzahl der Zeilen und Spalten im Wortrechteck (die bereitgestellt werden kann, ist jedoch in der Programmiersprache Ihrer Wahl am bequemsten)
Generieren Sie mindestens ein Wortrechteck. Wenn es nicht möglich ist, ein Wortrechteck mit dem angegebenen Lexikon und den angegebenen Dimensionen zu generieren, muss das Programm kein definiertes Verhalten haben. Es ist nicht erforderlich, dass das Programm Rechtecke mit mehr als 64 Buchstaben oder Abmessungen von mehr als 8 in beide Richtungen generieren kann. Das Programm sollte in angemessener Zeit abgeschlossen sein können, beispielsweise in 30 Minuten oder weniger.
BEARBEITEN: Wenn Sie ein NxN-Rechteck erstellen, dürfen Sie eine kleinere Wörterbuchdatei verwenden, die nur Wörter mit einer Länge von N Buchstaben enthält.
Antworten:
Haskell, 586 Zeichen
Wird durch Angabe von 3 Argumenten aufgerufen: Anzahl der Zeilen, Anzahl der Spalten, Anzahl der Lösungen; und die Wortliste wird akzeptiert am
stdin
:Wie Sie sehen können, läuft 7 × 7 relativ schnell. Immer noch Timing 8 × 8 und 7 × 6 ....
Es wäre 9 Zeichen kürzer, das Argument für die Anzahl der Lösungen zu entfernen und nur alle Lösungen zu erstellen, aber dann wird es unmöglich, die Zeit zu bestimmen.
Map String a
es langsamer ist als ein handgefertigter Baum ausMap Char a
...Vector
basiert, viel schneller als die Verwendung einer einfachenMap
. Warum das? Weil ich denke, dass eine Lösung, die in weniger als einer halben Stunde näher am Ziel von 8x8 liegt, einer kürzeren Lösung vorzuziehen ist.quelle
--make
nach ghc) mit der in der Frage angegebenen Wortliste verwende, erhalte ich Wörter, die nicht in der Liste enthalten sind, wie "zymesz" und "jugendlich".Python, 232 Zeichen
Es kann jedoch nur bis zu 6x6 im 1/2-Stunden-Limit verarbeiten.
quelle
3,3
aber seine Rückgabewörter3x4
+2
s in+1
s.\r
vonw
und auf Linux Ich habe konvertierte Datei in Unix - Format, so arbeiten beide nicht.Java (1065 Bytes)
Weit davon entfernt, der kürzeste zu sein, aber ich denke, es ist am nächsten an der Einhaltung der zeitlichen Einschränkungen. Ich habe 14 Bytes gespeichert, indem ich angenommen habe, dass die Eingabedatei nach Wörtern der richtigen Länge gefiltert wurde. Wenn Sie auf meinem Netbook das Ganze füttern
words.txt
, verbringt es die erste Minute damit, es vorzuverarbeiten, das meiste von dem, was es produziert, zu verwerfen, und dann dauert es nur etwa 20 Sekunden, um 7x7 zu lösen. Auf meinem Desktop erledigt es das Ganze in weniger als 15 Sekunden und gibt:Ich habe es über 50 Stunden laufen lassen, ohne eine Lösung für 8x7 oder 8x8 zu finden. 8-Buchstaben-Wörter scheinen eine kritische Grenze für dieses Problem zu sein - es schwebt nur halb voll, ohne große Fortschritte zu machen.
Der verwendete Ansatz ist das vollständige Schwenken und eine Heuristik, die auf der Anzahl möglicher horizontaler Abschlüsse multipliziert mit der Anzahl möglicher vertikaler Abschlüsse basiert. ZB wenn wir ein Zwischengitter haben
dann geben wir der oberen linken Ecke einen heuristischen Wert von
count(aean*)count(aa***) + count(bean*)count(ba***) + ... + count(zean*)count(za***)
. Von allen Zellen wählen wir die mit dem kleinsten heuristischen Wert aus (dh am schwierigsten zu befriedigen) und arbeiten dann die Buchstaben in absteigender Reihenfolge des Betrags durch, den sie zum heuristischen Wert dieser Zelle beigetragen haben (dh beginnend mit dem wahrscheinlichsten Erfolg) ).quelle
F #
Backtracking-Lösung, aber ich werde den Suchraum später optimieren.
quelle
awk, 283
(Möglicherweise müssen 14 für Parametereingabeflags hinzugefügt werden.)
Rufen Sie an mit zB
awk -v x=2 -v y=2
...Finden Sie die erste Übereinstimmung und drucken Sie sie aus (283 Zeichen):
Anzahl der Übereinstimmungen ermitteln (245 Zeichen, viel langsamer):
Für beide Programme (natürlich mehr für die Anzahl der Lösungen) überschreitet die Laufzeit für einige Werte von x und y 30 Minuten bei weitem.
Aus Gründen des Interesses ist hier die Wortanzahl für jede Wortlänge:
quelle