Ihre Aufgabe ist es, eine zufällige Abfolge von Zügen zu erstellen, mit denen Sie einen Rubik's Cube verschlüsseln können. Ein solches Scramble besteht aus genau 25 Zügen. Jeder Zug besteht aus den Buchstaben, UDRLFBoptional gefolgt von einem der Suffixe '2.
Diese Notation wird als Singmaster-Notation bezeichnet. UDRLFBStellt eine der 6 Flächen dar und das optionale Suffix gibt '2den Drehwinkel an. Diese Informationen sind in keiner Weise zur Lösung der Aufgabe erforderlich.
Um sicherzustellen, dass die Scrambles von "guter Qualität" sind, müssen die folgenden zwei Regeln gelten:
Zwei aufeinanderfolgende Züge dürfen nicht denselben Buchstaben haben. Dies verbietet die aufeinanderfolgenden bewegt
UU,DD,RR,LL,FFundBBund alle Kombinationen der optionalen Suffixe verwenden , wieU2UoderU'U'.Diese Zugpaare sind gesperrt, da sie leicht auf 1 oder 0 Züge reduziert werden können.
U2Uhat den gleichen Effekt wieU',R'Rden gleichen Effekt wie.Drei aufeinanderfolgende Züge dürfen nicht derselben Buchstabengruppe angehören. Die Buchstabengruppen sind
UD,RLundFB. Diese Regel zusätzlich verbietet die aufeinanderfolgenden bewegtUDU,DUD,RLR,LRL,FBF,BFBund alle Kombinationen der optionalen Suffixe wie unter Verwendung vonU2DU,RL'RoderB2FB'.Die Gruppen sortieren die Gesichter nach ihrer Bewegungsachse.
UundDbefinden sich in derselben Gruppe, da sich beide um dieselbe Achse drehen. Daher beeinflusst eineUBewegung nicht die Teile desDGesichts und eineDBewegung beeinflusst nicht die Teile desUGesichts. Daher können die beiden Züge getauscht werden,UDUhat den gleichen Effekt wieUUD, und dieser kann auf reduziert werdenU2D.
Herausforderung
Schreiben Sie ein Skript oder eine Funktion, die ein zufälliges Scramble generiert. Es erfolgt keine Eingabe. Das Skript / die Funktion muss die 25 Züge ohne Trennung oder durch ein Leerzeichen getrennt drucken oder die entsprechende Zeichenfolge zurückgeben.
Ihr Programm muss in der Lage sein, jedes einzelne Scramble zu erstellen, das die oben genannten Regeln erfüllt. Natürlich unter der Annahme, dass der Zufallszahlengenerator ein wahrer Zufall und kein Pseudozufall ist.
Das ist Code-Golf. Der kürzeste Code (in Bytes gezählt ) gewinnt.
Beispiele für Ausgaben:
Wenn Sie das Skript / die Funktion dreimal aufrufen, sollte Folgendes gedruckt / zurückgegeben werden:
R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D
Wenn Sie die Züge jeweils durch ein Leerzeichen trennen:
R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'
Beachten Sie, dass alle diese Ausgaben aus 25 Zügen bestehen, aber aufgrund der optionalen Suffixe unterschiedliche Längen haben. Es ist nicht erlaubt, ein Leerzeichen zu drucken, wenn entweder 2oder 'als Suffix verwendet werden. Sie müssen L2UR2F'R'U2oder drucken L2 U R2 F' R' U2. L2U R2F'R'U2ist nicht erlaubt.
L2U R2F'R'U2. Uhat kein optionales Suffix und sollte daher kein Leerzeichen enthalten. Ein Leerzeichen darf kein Ersatz für das optionale Suffix sein.
U F2 L D2 R'...zum Beispiel ausgeben ? In diesem Fall gibt es kein zusätzliches Leerzeichen, was nach Ihrer Regel meiner Meinung nach in Ordnung sein sollte.
UR 2ist nicht erlaubt?U R2sollte erlaubt sein, denke ich, da abstände zwischen zügen sinnvoll sind.