In letzter Zeit habe ich auf meinem iPhone ein Spiel namens Scramble gespielt. Einige von euch kennen dieses Spiel vielleicht als Boggle. Wenn das Spiel beginnt, erhält man im Wesentlichen eine Matrix von Buchstaben, etwa so:
F X I E
A M L O
E W B X
A S T U
Das Ziel des Spiels ist es, so viele Wörter wie möglich zu finden, die durch Aneinanderreihen von Buchstaben gebildet werden können. Sie können mit einem beliebigen Buchstaben beginnen, und alle Buchstaben, die ihn umgeben, sind Freiwild, und sobald Sie zum nächsten Buchstaben weitergehen, sind alle Buchstaben, die diesen Buchstaben umgeben, Freiwild, mit Ausnahme der bereits verwendeten Buchstaben . In dem obigen Raster könnte ich zum Beispiel die folgenden Wörter finden LOB
, TUX
, SEA
, FAME
, usw. Die Wörter müssen aus mindestens 3 Zeichen bestehen und dürfen nicht mehr als NxN Zeichen haben, was in diesem Spiel 16 Zeichen sind, aber in einigen Implementierungen variieren können. Obwohl dieses Spiel Spaß macht und süchtig macht, bin ich offensichtlich nicht sehr gut darin und wollte ein wenig schummeln, indem ich ein Programm erstellte, das mir die bestmöglichen Wörter liefert (je länger das Wort ist, desto mehr Punkte erhält man).
(Quelle: <a href="http://www.boggled.org/sample.gif" rel="noreferrer">verblüfft.org </a>)
Leider kenne ich mich mit Algorithmen, ihrer Effizienz usw. nicht besonders gut aus. Mein erster Versuch verwendet ein Wörterbuch wie zum Beispiel dieses (~2.3MB) und führt eine lineare Suche durch, um Kombinationen mit Wörterbucheinträgen zu finden. Dies dauert eine よほど lange Zeit, um die möglichen Wörter zu finden, und da man nur 2 Minuten pro Runde hat, ist das einfach nicht ausreichend.
Ich bin gespannt, ob Stackoverflowers effizientere Lösungen anbieten können. Ich bin vor allem auf der Suche nach Lösungen mit den Big 3 Ps: Python, PHP und Perl, obwohl alles mit Java oder C++ auch cool ist, da Geschwindigkeit entscheidend ist.
AKTUELLE LÖSUNGEN :
- Adam Rosenfield, Python, ~20s
- John Fouhy, Python, ~3s
- Kent Fredric, Perl, ~1s
- Darius Bacon, Python, ~1s
- rvarcher, VB.NET, ~1s
- Paolo Bergantino, PHP (Live-Link) , ~5s (~2s lokal)
1 Stimmen
Eine einfache Lösung ist die Klasse BoggleFinder aima.cs.berkeley.edu/python/search.html
0 Stimmen
Das macht doch keinen Spaß, oder? :)
18 Stimmen
Bitte übersetzen Sie dies beibehalten die gleichen HTML-Tags, wenn diese vorhanden sind von en nach de: Featureanfrage MEHR RÄTSEL
6 Stimmen
In Bezug auf die Zeitpunkte: In meiner Lösung wird praktisch die gesamte Zeit damit verbracht, den Trie aufzubauen. Sobald der Trie erstellt ist, kann er viele Male wiederverwendet werden. Wenn nur ein Rätsel gelöst wird, wäre es effizienter, eine einfachere Datenstruktur zu verwenden (wie eine Menge aller Wörter und aller Präfixe).
3 Stimmen
Auch Adam hat ein größeres Wörterbuch, wie durch die Anzahl der längeren Wörter in seiner Lösung belegt wird. Sie sollten alle basierend auf einem gemeinsamen Wörterbuch getestet werden.
0 Stimmen
@Reich: Ich führe sie alle auf meinem Computer mit meinem eigenen Wörterbuch aus.
2 Stimmen
Ich nehme an, dass niemand viel Boggle spielt? "Qu" ist ein "Buchstabe" und ich bin mir nicht sicher, wie viele der Lösungen dieses kleine Detail beachtet haben. Es sieht so aus, als ob einige von ihnen es ermöglichen würden, das "u" unabhängig zu verwenden, unter anderem Probleme.
2 Stimmen
Ich hatte kürzlich diese Frage bei einem Vorstellungsgespräch und bin nett in den Details steckengeblieben. Ich behandelte es als ein Graphenproblem, was in Ordnung ist, aber die Lösungen hier verwenden viel weniger Speicher. Ich code jetzt meine eigene Lösung. Gut gemacht an alle, die beigetragen haben!
0 Stimmen
Diese Frage scheint nicht zum Thema zu gehören, da es um Rätsellösungen geht. Es wäre passender auf codegolf.stackexchange.com
0 Stimmen
@Blazemonger Die Frage ist nach dem effizientesten Algorithmus zur Lösung eines Boggle gestellt, nicht nach dem kürzesten, und es handelt sich nicht um ein Rätsel im Codegolf-Stil. Soweit ich weiß, waren algorithmusbezogene Fragen fair für StackOverflow. Dies ist nicht off-topic, und ich denke, die Community hat ziemlich laut darüber gesprochen.
2 Stimmen
Sie sagen, dass Sie einen allgemeinen Algorithmus möchten, aber "Sie suchen hauptsächlich" nach konkretem Code in Python, PHP oder Perl. Sie haben keine eigene Arbeit geleistet, was heutzutage als wesentlich für SO-Fragen angesehen wird. Kommentare kennzeichnen dies eindeutig als "Rätsel" und nicht als eng definiertes Problem mit einer einzigen Lösung. Alles zusammen genommen könnte es als Codegolf geeignet sein, wie es geschrieben ist, aber wenn Sie diese Frage heute eingereicht hätten, würde sie sicherlich nicht als angemessen für SO angesehen. Meiner Meinung nach setzt es ein schlechtes Beispiel für Neulinge, was hier als "gute Frage" angesehen wird, wenn Sie sie offen lassen.
1 Stimmen
@Blazemonger 1. Die Bitte um bestimmte Sprachen ist für die Frage nach einem Algorithmus irrelevant. 2. Ich habe meine versuchte Lösung beschrieben und meine eigene gepostet. 3. Es ist definitiv eng und ausreichend definiert. 4. Es würde sicherlich offen bleiben, wenn es heute gepostet würde. 5. Wenn Neuankömmlinge Fragen stellen würden, die nur halb so gut sind wie diese, wären wir in guter Verfassung. Kurz gesagt, ich widerspreche respektvoll praktisch allem, was du gesagt hast.
0 Stimmen
@PaoloBergantino Tatsächlich sind offene Fragen, die zum analytischen Denken anregen, viel besser als die "Mach meinen Job, während ich Mittagessen gehe" Art von sogenannten Anfängerfragen, die heutzutage auf SO so verbreitet sind.
0 Stimmen
Ich erwarte, dass diese Frage gesperrt wird, da der Wert der Antworten darin liegt, aber ich stimme zu, dass sie nicht zum Thema gehört. Ich werde es erneut versuchen zu schließen. cc @Blazemonger.