Eine Zugfolge ist eine Folge von Zügen (Runden) auf einem Zauberwürfel (die Notation finden Sie unten). Neben der leeren Bewegungssequenz gibt es noch viele andere Bewegungssequenzen, die sich überhaupt nicht auf den Würfel auswirken. Wir nennen diese Bewegungssequenzen Identitätssequenzen.
Einige dieser Identitätssequenzen sind offensichtlich zu bestimmen, wie U2 R R' U2
oder U D2 U' D2
. Im ersten werden zwei zufällige Züge ausgeführt U2 R
und anschließend sofort rückgängig gemacht R' U2
. Der zweite ist ähnlich. Die ersten zwei zufälligen Züge U D2
und danach werden sie rückgängig gemacht, jedoch in umgekehrter Reihenfolge U' D2
. Dies funktioniert nur, weil die Verschiebung U
nur die Teile der oberen Ebene und die Verschiebung D2
nur die Teile der unteren Ebene beeinflusst. Sie sehen eine Visualisierung dieser beiden Bewegungsabläufe.
Andere Identitätssequenzen sind möglicherweise überhaupt nicht offensichtlich. Zum Beispiel die Reihenfolge R' U' R' F' U F U' R' F R F' U' R U2 R
. Es ist ziemlich lang, hat aber auch überhaupt keine Wirkung auf den Würfel.
Notation verschieben
Ein Zug beschreibt die Drehung einer Schicht von einer der sechs Seiten des Würfels. Ein Zug besteht aus einem Buchstaben für das Gesicht, gefolgt von einem optionalen Suffix für den Drehwinkel.
Die Buchstaben und ihre entsprechenden Flächen sind U (oben - die Seite zeigt nach oben), D (unten - die Seite zeigt nach unten), R (rechts - die Seite zeigt nach rechts), L (links - die Seite zeigt nach links) , F (Vorderseite - die Ihnen zugewandte Seite) und B (Rückseite - die von Ihnen abgewandte Seite).
Wenn es kein Suffix gibt, wird das Gesicht um 90 Grad im Uhrzeigersinn gedreht, das Suffix '
bedeutet, das Gesicht wird um 90 Grad gegen den Uhrzeigersinn gedreht, und das Suffix 2
bedeutet, das Gesicht wird um 180 Grad im Uhrzeigersinn gedreht.
Wenn Sie Probleme mit der Notation haben, verwenden Sie einfach http://alg.cubing.net , wo Sie solche Bewegungsabläufe visualisieren können.
Die Herausforderung
Ihre Aufgabe ist es, ein Programm zu schreiben, das feststellt, ob eine Bewegungssequenz eine Identität ist oder nicht.
Sie können ein vollständiges Programm oder eine Funktion schreiben. Als Eingabe (über STDIN, Befehlszeilenargument, Eingabeaufforderung oder Funktionsargument) und als Ausgabe (über Rückgabewert oder STDOUT) einen booleschen Wert oder eine entsprechende Ganzzahl ( True - 1 - Identitätssequenz / False - 0 - nicht Identitätssequenz).
Wenn das Suffix '
Probleme in Ihrer Programmiersprache verursacht, können Sie ein anderes Symbol verwenden, jedoch nicht eine Ziffer. R F2 U3
ist nicht erlaubt.
Dies ist Codegolf, daher gewinnt der kürzeste Code (in Bytes).
Testfälle
"" -> True
"U2 R R' U2" -> True
"U D2 U' D2" -> True
"U2 R U2 R'" -> False
"R' U' R' F' U F U' R' F R F' U' R U2 R" -> True
"L'" -> False
"B B2 B' B2" -> True
"D D2 D'" -> False
"R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'" -> True
"D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2" -> False
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'" -> True
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'" -> False
"B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2" -> True
"R U2 R' U R' U2 R U2 R U R' U' R' U R U2" -> False
"U F B' R' U F' R U' F' B L U' F L'" -> False
"R2 U' R' U' R U R U R U' R" -> False
"R' F R' B2 R F' R' B2 R2" -> False
quelle
R F2 U3
?U3
, könntest du das Suffix einfach in eine Ziffer umwandeln.R2 D2
.That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Antworten:
Haskell,
263261247243 ZeichenEher einfacher Algorithmus; Jedes Cubelet besteht aus 1,2,4 oder 8 Stücken, die seine Position und Ausrichtung codieren. 4 Stücke pro Randwürfel, 8 pro Eckwürfel, 7 Würfel sind stationär.
c
c hüpft jedes Wort der Eingabe in eine Folge von CW-Runden und!
sendet jeden Chunk entsprechend einer Runde.i
ist die i dentity position.f
ist der Hauptteil f unktion.Ich bin nicht sehr zufrieden mit der
c
Homp-Funktion, aber ich kann auch keine Möglichkeit finden, sie zu verkürzen (@Nimi hat es jedoch getan).quelle
c(x:"2")=[x,x]
undc(x:_)=[x,x,x]
. Spart 2 Bytes.i=sequence[s,s,s]
und alle Tupel in Listen ändern (dh:(x,y,z)
werden[x,y,z]
), werden ~ 9 Zeichen gespeichert. Inlining spart 4 weitere. Durch das_
!
i
, danke. Nicht sicher, was Sie mit Inlining meineni
- bitte beachten Sie, dass es in der Definition für zweimal vorkommtf
. Ich bin mir nicht sicher, was Sie damit meinen, dass Sie den_
Fall fallen lassen - entweder gehen_->a
ganz weglassen oder ganz nach oben verschieben - wird eine nicht erschöpfende Musterausnahme ausgegeben, und wenn Sie es nach oben verschieben, werden keine Zeichen gespeichert. Dort konnte ich allerdings 5 Zeichen speichern.Kubisch ,
64 BytesIch gewinne: P
Der Notizblock wird auf Null initialisiert. Die 8. "Fläche" enthält 1, wenn der Würfel ungelöst ist, und 0, wenn nicht.
Probieren Sie es online!
quelle
J-
232, 220, 381, 315296 BytesDiese Lösung kodiert alle Operationen als Flächenpermutationen und basiert auf der Tatsache, dass alle Flächenveränderungen bei einer Drehung des gesamten Würfels tatsächlich gleich sind.
Edit : noch mehr Golf
Anders als die vorherigen Versuche, dies nicht Ecke Rotation berücksichtigt.
f
ist nur eine Hilfsfunktion.r
macht die Rotation eines Gesichts. Ein Gesicht wird wie folgt codiert:Diese Reihenfolge erleichtert die Codierung von Rotationen und Drehungen.
t
ist ein Adverb, das das Gesicht unter einer bestimmten Würfelrotation dreht und das Gesicht auswählt.X
undY
sind Adverbien, die als linkes Argument die Anzahl von in dieser Richtung des gesamten Würfels nehmen.Die nächste Zeile definiert alle Umdrehungen: 3 Zeichen pro Umdrehung: den Namen, die Anzahl der Umdrehungen und die Richtung.
Die letzte Zeile definiert das Testverb
T
, konvertiert 3 und'
in die Potenznotation, kippt die Operationsreihenfolge um, fügt den Testvektor hinzu und führt schließlich die gesamte Sache aus.Weitere Details auf Anfrage.
quelle
Python 3: 280 Zeichen
Dies ist kein Teilnehmer an der Herausforderung. Erstens, weil ich die Herausforderung selbst gestellt habe und zweitens, weil es nicht mein Code ist. Alle Credits gehören Stefan Pochmann , der diese großartige Art der Simulation eines Zauberwürfels entdeckt hat. Ich habe nur ein bisschen Golf gespielt und ein paar kleinere Änderungen in Bezug auf die Herausforderung vorgenommen.
Die Idee dahinter ist die folgende.
s
Stellt die Position der Teile vonUF
,UR
usw. dar. Zum Beispiel:s = ['DF', 'BL', ...]
bedeutet, dass das StückUF
an der Position istDF
, das StückUR
an der Position istBL
, ...Wie ändert sich die Position einer Figur, wenn ein Zug ausgeführt wird? Wenn Sie eine
U
Bewegung ausführen, werden alle Aufkleber (Farben) derU
Ebene, die der Vorderseite zugewandt sind, auf die linke Seite verschoben. Die Aufkleber des linken Gesichts bewegen sich nach hinten, diese nach rechts und diese nach vorne. Codiert vonFLBR
. Einige Beispiele:UF
bewegt sich zuUL
,UFR
bewegt sich zuULF
und so weiter. Beim Bewegen werden daher einfach die Flächen der Teile in der entsprechenden Ebene verschoben.quelle