Schreiben Sie eine Funktion, die zwei Parameter akzeptiert: eine positive Ganzzahl n und eine Liste von Wörtern.
Weisen Sie bei einem Würfel von n- mal- n- mal- n- Einheiten jeder Oberflächeneinheit einen zufälligen Buchstaben (AZ) zu. (Für einen 3x3x3-Würfel gibt es 9 Oberflächeneinheiten auf jeder Seite.)
Bestimmen Sie dann, ob eine Ameise, die über die Oberfläche läuft (mit der Fähigkeit, Gesichter zu kreuzen), jedes der angegebenen Wörter buchstabieren kann. Angenommen, um ein Wort zu buchstabieren, müssen die Buchstaben oben / unten oder links / rechts nebeneinander sein, aber nicht unbedingt auf derselben Seite. [ Zur Verdeutlichung bearbeiten: Die Ameise kann ihren Pfad umkehren und Buchstaben mehrmals verwenden. Jede Oberflächeneinheit zählt als ein Zeichen. Um ein Wort mit wiederholten Buchstaben (z. B. "sehen") zu buchstabieren, müsste die Ameise drei benachbarte Einheiten besuchen.]
Die Funktion sollte zwei Dinge ausgeben:
1) Jeder der Buchstaben auf jeder Seite, so dass die Topologie abgeleitet werden kann. Für einen 2x2x2-Würfel würde beispielsweise eine akzeptable Ausgabe folgendermaßen aussehen:
QW
ER
TY OP UI
DF JK XC
AS
GH
LZ
VB
2) Jedes der Wörter zusammen mit einem Booleschen Wert, der angibt, ob die Ameise das Wort buchstabieren kann, indem sie über die Oberfläche des Würfels läuft. Zum Beispiel:
1 ask
0 practical
1 pure
0 full
Bonus-Herausforderung (wird nicht nur zum Spaß in die Punktzahl einbezogen): Anstatt n nur die Größe des Würfels darzustellen , soll n auch die Dimensionalität der Form darstellen. Ein n von 2 würde also ein 2x2-Quadrat ergeben; ein n von 3 würde einen 3x3x3-Würfel ergeben; und ein n von 4 würde einen 4x4x4x4-Tesserakt ergeben.
qwq
oderqq
im Beispielwürfel finden?Antworten:
Ruby, 272 Bytes
Zu beiden Seiten der verschachtelten Funktion werden dem Code zwei unnötige Zeilenumbrüche hinzugefügt
g
, um die Lesbarkeit zu verbessern. Diese sind von der Partitur ausgeschlossen. Die Zeichenf=
, die einer Variablen die anonyme Funktion zuweisen, werden ebenfalls ausgeschlossen.Das Ausgabeformat ist
0
oder1
gemäß der Frage anstelle von Rubys nativemtrue
undfalse
. Eine neue Zeile (anstelle eines Leerzeichens) wird verwendet, um den Booleschen Wert und das Wort zu trennen. Mein Verständnis ist, dass dies eine akzeptable Interpretation der Ausgabeanforderungen ist, aber wenn nicht, wäre die Auswirkung auf die Byteanzahl gering.Ausgabe
Nach ungefähr 50 Anrufen wie folgt:
Ich habe endlich die folgende Ausgabe mit 2 Treffern bekommen.
ANT
ist unten rechts und geht nach oben, und dasAN
wird geteiltCAN
, wobei dieC
Umhüllung oben links ist.Erläuterung
Die besondere Entfaltung des ausgewählten Würfels wurde teilweise aufgrund seiner einfachen Zeichnung, hauptsächlich aber aufgrund seiner einfachen Suche ausgewählt.
Die Nicht-Alphabet-Zeichen (die Punkte plus die neue Zeile am Ende jeder Zeile) sind ein wichtiger Teil des Feldes, in dem sich die Ameise beim Gehen befindet.
Die Suche wird von der rekursiven Funktion durchgeführt
g
, die in der Funktion verschachtelt istf
. Wenn das übergebene Wort eine leere Zeichenfolge ist, ist die Suche abgeschlossen und$r
auf 1 gesetzt. Befindet sich die Ameise auf einem Buchstabenquadrat, das dem ersten Buchstaben des Wortes entspricht, wird die Suche in alle vier Richtungen fortgesetzt: Die Funktion wird erneut aufgerufen mit dem Wort verkürzt durch Entfernen des ersten Buchstabens. In diesem Fall wird der Richtungsparameter ignoriert. Das Verschieben erfolgt durch rekursives Aufrufen mit dem durch die Werte in geänderten Zellenindex.x.
Das Ergebnis der Addition wird modulo der Größe des Gitters plus einer zusätzlichen halben Linie genommen. Dies bedeutet, dass die untere Linie mit dem richtigen horizontalen Versatz nach oben und umgekehrt gewickelt wird.Befindet sich die Ameise auf einem Nicht-Buchstaben-Quadrat, muss sie sich im Zickzack in einer Treppenbewegung bewegen, bis sie ein Buchstaben-Quadrat findet. Sie wird in südöstlicher oder nordwestlicher Richtung zizagieren. Dies wird durch rekursive Aufrufe simuliert, wobei der
d
Parameter jedes Mal mit 1 XOR-verknüpft wird, um ihre Bewegung zu verfolgen. Bis sie das nächste Buchstabenquadrat erreicht, wird das eingegebene Wort nicht verkürzt. Praktischerweise kann dies durch dieselbe Rekursion erfolgen, die verwendet wird, wenn wir in dem Bereich mit Buchstaben suchen. Der Unterschied besteht darin, dass die Rekursion nur einen Zweig hat, wenn sich die Ameise im Leerzeichenbereich befindet, im Gegensatz zu 4 im Buchstabenbereich.Kommentierter Code
quelle