Une séquence de mouvements est une séquence de mouvements (tours) sur un Rubik's Cube (pour la notation, regardez ci-dessous). À côté de la séquence de déplacement vide, il existe de nombreuses autres séquences de déplacement, qui n'ont aucun effet sur le cube. Nous appelons ces séquences d'identité des séquences de mouvements.
Certaines de ces séquences d'identité sont évidentes à déterminer, comme U2 R R' U2
ou U D2 U' D2
. Dans le premier, deux mouvements aléatoires sont effectués U2 R
et ensuite immédiatement annulés R' U2
. Le second est similaire. Deux premiers mouvements aléatoires U D2
et ensuite ils sont annulés, mais dans l'ordre inverse U' D2
. Cela ne fonctionne que parce que le déplacement U
n'affecte que les morceaux du calque supérieur et que le déplacement n'affecte D2
que les morceaux du calque inférieur. Vous pouvez voir une visualisation de ces deux séquences de mouvements.
D'autres séquences d'identité peuvent ne pas être évidentes du tout. Par exemple la séquence R' U' R' F' U F U' R' F R F' U' R U2 R
. Il est assez long, mais n'a aucun effet sur le cube.
Déplacer la notation
Un coup décrit le tour d'une couche de l'une des six faces du cube. Un mouvement consiste en une lettre représentant le visage suivie d'un suffixe facultatif représentant l'angle de virage.
Les lettres et leurs faces correspondantes sont U (Haut - le côté tourné vers le haut), D (Bas - le côté tourné vers le bas), R (Droite - le côté tourné vers la droite), L (Gauche - le bord tourné vers la gauche) , F (avant - le côté face à vous) et B (arrière - le côté face à vous).
S'il n'y a pas de suffixe, le visage est tourné de 90 degrés dans le sens des aiguilles d'une montre, le suffixe '
signifie, le visage est tourné de 90 degrés dans le sens inverse des aiguilles d'une montre, et le suffixe 2
signifie, le visage est tourné de 180 degrés dans le sens des aiguilles d'une montre.
Si vous avez des problèmes avec la notation, utilisez simplement http://alg.cubing.net , où vous pouvez visualiser de telles séquences de mouvement.
Le défi
Votre tâche consiste à écrire un programme, qui détermine si une séquence de mouvement est une identité ou non.
Vous pouvez écrire un programme complet ou une fonction. Il doit recevoir une chaîne contenant une séquence de déplacement (les déplacements sont séparés par des espaces) en entrée (via STDIN, argument de ligne de commande, invite ou fonction) et sortir (via la valeur de retour ou STDOUT) une valeur booléenne ou un entier correspondant ( Vrai - 1 - séquence d'identité / Faux - 0 - pas de séquence d'identité).
Si votre suffixe '
crée des problèmes dans votre langage de programmation, vous pouvez utiliser un symbole différent, mais pas à digit. R F2 U3
n'est pas autorisé.
C'est codegolf, donc le code le plus court (en octets) l'emporte.
Cas de test
"" -> 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
la source
R F2 U3
?U3
, vous pouvez simplement transposer le suffixe en chiffres.R2 D2
.That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Réponses:
Haskell,
263261247243 caractèresAlgorithme plutôt simple; chaque cubelet est constitué de 1,2,4 ou 8 morceaux codant sa position et son orientation; 4 morceaux par cubelet de bord, 8 par cubelet d'angle, 7 cubelet sont stationnaires.
c
c homps chaque mot de l'entrée dans une séquence de tours CW, et!
envoie chaque bloc selon un tour.i
est la position i dentity.f
est la principale fonction .Je ne suis pas trop satisfait de la
c
fonction homp, mais je n'arrive pas à trouver un moyen de la raccourcir non plus (@Nimi l'a fait, cependant)la source
c(x:"2")=[x,x]
etc(x:_)=[x,x,x]
. Enregistre 2 octets.i=sequence[s,s,s]
et changez tous les tuples en listes (c'est-à-dire:(x,y,z)
devient[x,y,z]
) - cela économisera ~ 9 caractères. En l'inclinant, vous en économisez 4 de plus. La suppression de l'_
affaire en!
sauve encore 11.i
, merci. Je ne sais pas exactement ce que vous entendez par insertioni
- veuillez noter qu'il apparaît deux fois dans la définition def
. Vous ne savez pas ce que vous voulez dire en supprimant le_
cas - soit en le laissant_->a
complètement ou en le déplaçant vers le haut génère une exception de modèle non exhaustive, et le déplacer vers le haut ne sauvegarde de toute façon aucun caractère. Cependant, j'ai réussi à enregistrer 5 caractères.Cubiquement ,
64 octetsJe gagne: P
Le bloc-notes est initialisé à zéro. La 8ème "face" contient 1 si le cube n'est pas résolu et 0 sinon.
Essayez-le en ligne!
la source
J -
232, 220, 381, 315296 octetsCette solution code toutes les opérations en permutations de faces et fonctionne en se basant sur le fait que toutes les torsions de faces sont en fait les mêmes, sous une rotation de tout le cube.
Edit : un peu plus de golf
Outre les essais précédents, cela ne prend la rotation d'angle en compte.
f
est juste une fonction d'aide.r
fait la rotation d'une face. un visage est codé comme suit:cet ordre facilite l'encodage des rotations et des torsions.
t
est un adverbe qui tord le visage sous une certaine rotation de cube, sélectionnant le visage.X
etY
sont des adverbes qui prennent comme argument de gauche le nombre de dans cette direction du cube entier.La ligne suivante définit toutes les rotations: 3 caractères par rotation: le nom, le nombre de rotations et la direction.
La dernière ligne définit le verbe de test
T
, convertissant 3 et'
en notation Power, inversant l'ordre des opérations en ajoutant le vecteur de test et en excutant finalement le tout.Plus de détails sur demande.
la source
Python 3: 280 caractères
Ce n'est pas un participant au défi. D'abord parce que j'ai moi-même posé le défi et ensuite parce que ce n'est pas mon code. Tous les crédits appartiennent à Stefan Pochmann , qui a découvert cette façon géniale de simuler un Rubik's Cube. Je n'ai fait que du golf et quelques changements mineurs par rapport au défi.
L'idée derrière cela est la suivante.
s
représente l'emplacement des pièces deUF
,UR
et ainsi de suite. Par exemple:s = ['DF', 'BL', ...]
signifie que la pièceUF
est à la positionDF
, la pièceUR
est à la positionBL
, ...Comment la position d'une pièce change-t-elle lors d'un mouvement. Si vous effectuez un
U
déplacement, tous les autocollants (couleurs) duU
calque, qui faisaient face à la face avant, se déplacent vers la gauche. Les autocollants de la face gauche se déplacent vers l'arrière, ceux-ci vers la droite et ceux-ci vers la face avant. Encodé parFLBR
. Quelques exemples:UF
se déplace versUL
,UFR
se déplace versULF
et ainsi de suite. Par conséquent, appliquer un mouvement, c'est simplement traduire les faces des pièces dans le calque correspondant.la source