Identitätssequenzen auf dem Rubik's Cube


32

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' U2oder U D2 U' D2. Im ersten werden zwei zufällige Züge ausgeführt U2 Rund anschließend sofort rückgängig gemacht R' U2. Der zweite ist ähnlich. Die ersten zwei zufälligen Züge U D2und danach werden sie rückgängig gemacht, jedoch in umgekehrter Reihenfolge U' D2. Dies funktioniert nur, weil die Verschiebung Unur die Teile der oberen Ebene und die Verschiebung D2nur die Teile der unteren Ebene beeinflusst. Sie sehen eine Visualisierung dieser beiden Bewegungsabläufe.

U2 RR 'U2 U D2 U 'D2

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.

Bildbeschreibung hier eingeben

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 2bedeutet, 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 U3ist 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

Was ist los mit R F2 U3?
John Dvorak

2
Ich möchte nur sicherstellen, dass alle die gleichen Voraussetzungen haben. Wenn ich das erlauben würde U3, könntest du das Suffix einfach in eine Ziffer umwandeln.
Jakube

3
Ich bin eher an die Notation gewöhnt, die T-Top, B-Bottom und P-Posterior (Rückseite) verwendet. Die Leute mochten es wahrscheinlich nur, die Sequenz zu sehen R2 D2.
mbomb007

2
@ mbomb007 Ich kann T für oben verstehen, aber ich habe P für hinten nie gesehen und ich würde seine Bedeutung nicht verstehen, wenn es nicht für Ihren Kommentar ...
John Dvorak

2
@ mbomb007 Ich habe diese Notation auch gesehen, aber sie ist weder so gebräuchlich noch so alt wie die ursprüngliche Singmaster-Notation, und ich weiß nicht, warum die Leute sich mit dem Original anlegen wollen. Obwohl David Singmaster es (soweit ich weiß) nicht erwähnt hat, habe ich festgestellt, dass alle Gesichter perfekt übereinstimmen und keine Konflikte aufweisen, wenn sie als Richtungen und nicht als Positionen betrachtet werden. That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Level River St

Antworten:


14

Haskell, 263 261 247 243 Zeichen

c[x]=[x]
c(x:"2")=[x,x]
c(x:_)=[x,x,x]
s!a@[x,y,z]=case s of
 'R'|x>0->[x,-z,y]
 'B'|y>0->[z,y,-x]
 'U'|z>0->[-y,x,z]
 'L'|x<0->[x,z,-y]
 'F'|y<0->[-z,y,x]
 'D'|z<0->[y,-x,z]
 _->a
r=[-2..2]
i=mapM id[r,r,r]
f w=i==foldr(map.(!))i(c=<<words w)

Eher 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. iist die i dentity position. fist der Hauptteil f unktion.

Ich bin nicht sehr zufrieden mit der cHomp-Funktion, aber ich kann auch keine Möglichkeit finden, sie zu verkürzen (@Nimi hat es jedoch getan).


Wie wäre es mit c(x:"2")=[x,x]und c(x:_)=[x,x,x]. Spart 2 Bytes.
nimi

Wenn Sie verwenden 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 _!
Löschen

@MtnViewMark erledigt und verbessert i, danke. Nicht sicher, was Sie mit Inlining meinen i- bitte beachten Sie, dass es in der Definition für zweimal vorkommt f. 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.
John Dvorak

Großartige Lösung. Ich habe alle Testfälle überprüft.
Jakube

Nochmals herzlichen Glückwunsch zu Ihrer Lösung. Da Sie den kürzesten Code vorgelegt haben, erhalten Sie das Kopfgeld im Wert von 100 Ruf.
Jakube,

4

Kubisch , 6 4 Bytes

¶=8%

Ich gewinne: P

¶=8%
¶     read a string, evaluate as Cubically code
 =8   set notepad to (notepad == 8th face)
   %  print notepad

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!


3
Sieht nach einer interessanten Sprache aus. Da die Sprache jedoch erstellt wurde, nachdem die Herausforderung veröffentlicht wurde, ist sie nicht gewinnberechtigt.
Jakube

2
@Jakube Ich bin damit einverstanden, dass es nicht akzeptiert werden sollte, nur weil es eine Sprache ist, in der Rubik's Cube so spät nach der Herausforderung veröffentlicht wurde und die anderen Antworten so vollständig dezimiert werden. Technisch gesehen ist es jedoch gemäß Meta gewinnberechtigt (die nicht konkurrierende Regel wurde etwas widerrufen).
MD XF

3

J- 232, 220, 381, 315 296 Bytes

Diese 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

f=:+/~6&*
r=:4 :'y f&.>(]{^:x~)&.C.;/i.2 4'"0
t=:((r~0),_4<\44#.inv 1478253772705907911x)&C.&.
Y=:(C.(,0 2 r 4 5),;/4 f&i.8)&{^:t
X=:((,1 1 0 2 r 2 4 3 1)C.C.;/0 4 2 5 f i.8)&{^:t
61".@A."1'=: ',"#~6 3$'D0XR1YF1XU2YB3XL3Y'
T=:[:(_2".@}.'(i.48)-:'&(,,[))[:(,'^:',])/&.>@|.&.;:[:''''&=@{.`]},:&'3'

Anders als die vorherigen Versuche, dies nicht Ecke Rotation berücksichtigt.

fist nur eine Hilfsfunktion. rmacht die Rotation eines Gesichts. Ein Gesicht wird wie folgt codiert:

  1. alle ecken in 6er schritten
  2. alle Kanten in Sechserschritten

Diese Reihenfolge erleichtert die Codierung von Rotationen und Drehungen. tist ein Adverb, das das Gesicht unter einer bestimmten Würfelrotation dreht und das Gesicht auswählt.

Xund Ysind 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.

tests =: (] ;. _2) 0 : 0

 U2 R R' U2
 U D2 U' D2
 U2 R2 R'
 R' U' R' F' U F U' R' F R F' U' R U2 R
 L'
 B B2 B' B2
 D D2 D'
 R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'
 D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2
 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'
 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'
 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
 R U2 R' U R' U2 R U2 R U R' U' R' U R U2
 U F B' R' U F' R U' F' B L U' F L'
 R2 U' R' U' R U R U R U' R
 R' F R' B2 R F' R' B2 R2
)
res =: 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
res ([,],:=) T"1 tests NB. passes all tests.
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

NB. some handy display methods:
dispOrig=: (". ;._2) 0 :0
   _   _   _   5  29  11   _   _   _   _   _   _
   _   _   _  47  _1  35   _   _   _   _   _   _
   _   _   _  23  41  17   _   _   _   _   _   _
   3  27   9   0  24   6   1  25   7   2  26   8
  45  _3  33  42  _6  30  43  _5  31  44  _4  32
  21  39  15  18  36  12  19  37  13  20  38  14
   _   _   _   4  28  10   _   _   _   _   _   _
   _   _   _  46  _2  34   _   _   _   _   _   _
   _   _   _  22  40  16   _   _   _   _   _   _
)
ind =: dispOrig i.&, i. 48 NB. indices of i.48 in the original display

disp =: (9 12$(,dispOrig) ind}~ ])
changed =: 1 : '(u ~:&disp ]) i.48' NB. use to debug permutation verbs: L ch
vch =: 1 :'disp  ((]+_*=) u)'
NB. viewmat integration RGB
cm =: 255 * 1 0 0 , 1 1 1, 0 1 0, 1 1 0, 1 0.5 0, 0 0 1,: 0 0 0 NB. colormap
NB. use as:  "cube i. 48" for seeing a nice folded out cube.
cube =: cm viewmat (>&7 + >&15 + >&23 + >&31 + >& 39 + >&47)@|@disp@]

11
"Da meine Testergebnisse nicht mit den angegebenen übereinstimmen ..." wie in, funktioniert Ihre Lösung nicht? Ich würde es dann nicht posten ...
John Dvorak

Du hast recht. Behebt es jetzt.
Jpjacobs

Ich habe 4 zusätzliche Testfälle hinzugefügt. Zwei von ihnen geben immer noch das falsche Ergebnis zurück. Sieht so aus, als würden Sie die Ausrichtung der Ecken ignorieren.
Jakube

@jpjacobs Auf die Frage gibt es jetzt ein Kopfgeld von 100 Wiederholungen. Möchten Sie Ihren Code korrigieren?
Jakube

Voila, fertig. Jetzt nur noch reduzieren.
Jpjacobs

2

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.

def f(a):
 s=t="UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR".split()
 for m in a.split():q="FLBR FRBL FDBU FUBD URDL ULDR".split()['UDLRFB'.index(m[0])];n=2+"2'".find(m[-1]);s=[[p,p.translate(str.maketrans(q,q[n:]+q[:n]))][m[0]in p]for p in s]
 return s==t

Die Idee dahinter ist die folgende. sStellt die Position der Teile von UF, URusw. dar. Zum Beispiel: s = ['DF', 'BL', ...]bedeutet, dass das Stück UFan der Position ist DF, das Stück URan der Position ist BL, ...

Wie ändert sich die Position einer Figur, wenn ein Zug ausgeführt wird? Wenn Sie eine UBewegung ausführen, werden alle Aufkleber (Farben) der UEbene, 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 von FLBR. Einige Beispiele: UFbewegt sich zu UL, UFRbewegt sich zu ULFund so weiter. Beim Bewegen werden daher einfach die Flächen der Teile in der entsprechenden Ebene verschoben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.