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, UDRLFB
optional gefolgt von einem der Suffixe '2
.
Diese Notation wird als Singmaster-Notation bezeichnet. UDRLFB
Stellt eine der 6 Flächen dar und das optionale Suffix gibt '2
den 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
,FF
undBB
und alle Kombinationen der optionalen Suffixe verwenden , wieU2U
oderU'U'
.Diese Zugpaare sind gesperrt, da sie leicht auf 1 oder 0 Züge reduziert werden können.
U2U
hat den gleichen Effekt wieU'
,R'R
den gleichen Effekt wie.
Drei aufeinanderfolgende Züge dürfen nicht derselben Buchstabengruppe angehören. Die Buchstabengruppen sind
UD
,RL
undFB
. Diese Regel zusätzlich verbietet die aufeinanderfolgenden bewegtUDU
,DUD
,RLR
,LRL
,FBF
,BFB
und alle Kombinationen der optionalen Suffixe wie unter Verwendung vonU2DU
,RL'R
oderB2FB'
.Die Gruppen sortieren die Gesichter nach ihrer Bewegungsachse.
U
undD
befinden sich in derselben Gruppe, da sich beide um dieselbe Achse drehen. Daher beeinflusst eineU
Bewegung nicht die Teile desD
Gesichts und eineD
Bewegung beeinflusst nicht die Teile desU
Gesichts. Daher können die beiden Züge getauscht werden,UDU
hat 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 2
oder '
als Suffix verwendet werden. Sie müssen L2UR2F'R'U2
oder drucken L2 U R2 F' R' U2
. L2U R2F'R'U2
ist nicht erlaubt.
quelle
UR 2
ist nicht erlaubt?U R2
sollte erlaubt sein, denke ich, da abstände zwischen zügen sinnvoll sind.L2U R2F'R'U2
.U
hat 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.Antworten:
CJam,
4745 BytesDiese Lösung verwendet einen Ansatz, der sich von allen bisher veröffentlichten unterscheidet. Es nutzt CJams prägnante Listenoperationen, um die verfügbare Verschiebungsliste zu generieren und bei jeder Iteration eine zufällige auszuwählen. Modifikatoren werden einfach unabhängig generiert.
Probieren Sie es online aus.
Erläuterung
quelle
C 129
Die innere Schleife erzeugt einen Wert
m
in dem Bereich,1..5
der, wenn zus
Modulo 6 addiert und genommen, sicherstellt, dass sich keine zwei aufeinander folgenden Züge auf derselben Seite des Würfels befinden. Der alte Wert vonm
wird in gespeichertn
und der Testm*n==9
stellt sicher, dass der Wertm
= 3 niemals zweimal hintereinander generiert wird (daher können gegenüberliegende Flächen nicht zweimal hintereinander ausgewählt werden; beachten Sie die Reihenfolge der Flächen in der Zeichenfolge.)Das niedrigstwertige Teil
r
verwendet wird , das Suffix zu entscheiden ('
,2
oder null) verwendet werden , am Ende der Vorteil der Null - Zeichen unter"'2"
.Die äußere Schleife läuft 26 mal. Das erste Mal
U
kann nie ausgewählt werden, wird alsoprintf
für die erste Iteration unterdrückt.Ungolfed Code im Testprogramm
Der ungolfed Code fügt aus Gründen der Klarheit zwischen den einzelnen Zügen ein Leerzeichen ein (der golfed Code nicht, um ein Byte zu sparen.) Zusätzlich speichert der golfed Code ein Semikolon, indem er
printf
diefor
Klammer umsetzt .Typische Ausgabe
quelle
Pyth,
6566Ich habe noch nie richtig in Pyth Golf gespielt, vielleicht ein oder zwei Programme geschrieben. Dies ist im Grunde die in Pyth übersetzte Lösung von @ steveverrill. Verbesserungsvorschläge sind willkommen.
Update: 1 Byte hinzugefügt, damit auch die Verschlüsselung beginnt
U
. Vielleicht basiert die C-Lösung auf undefiniertem Verhalten, damit es funktioniert ...Ich bin der Meinung, dass dies mit weniger Aufgaben erledigt werden sollte, aber dafür müsste ich den Algorithmus stark modifizieren. (Nun, könnte versuchen.)
Hier ist eine Erklärung basierend auf dem C-Code:
quelle
Y
undZ
.Z
wird mit 0 vorinitialisiert, so dass Sie die ersten 3 Zeichen speichern.n = m
(3. Erklärungszeile), wasn = 0
das erste Mal bedeuten muss , was wiederumY
0 seinY
wird mit einer leeren Liste vorinitialisiert[]
. Und ich denke nicht, dass der Wert vonn
Dingen in der ersten Iteration wichtig ist.U
.JavaScript (ES6) 175
178 2043 Bytes weniger bearbeiten , 1 durch Ändern des Codes und 2 durch Ändern der Art und Weise, wie Bytes gezählt werden (nicht gezählt
F=
)Der Code zur Vermeidung von Wiederholungen stammt von @stevemiller. Seine Art, die Briefgruppen zu verwalten, ist noch besser, aber ich werde es nicht stehlen.
Bonus: Sie können optional die Anzahl der Züge angeben.
Weniger golfen
Prüfung
quelle
Javascript - 112
quelle
Java 8,
189183 BytesPort der C-Antwort von @LevelRiverSt . Ich habe einige Dinge selbst ausprobiert, aber das war kürzer als das, was ich hatte.
Probieren Sie es online aus.
quelle
Ruby ,
116 107 10595 BytesProbieren Sie es online!
quelle
Clojure, 223 Bytes
Dies hängt stark von dem Muster "sequence -> partition-by -> filter -> concat" ab, mit dem "unzulässige" Folgen von Gesichtern herausgefiltert werden. Diese Sequenz wird dann zusammen mit einem zufälligen Postfix (einschließlich der leeren Zeichenfolge) einer Zeichenfolge zugeordnet.
Ungolfed Startpunkt:
quelle