Votre tâche consiste à créer une séquence aléatoire de mouvements, qui peut être utilisée pour brouiller un Rubik's Cube. Une telle bousculade est composée d'exactement 25 coups. Chaque mouvement se compose des lettres UDRLFB
éventuellement suivies d'un des suffixes '2
.
Cette notation est appelée notation Singmaster. UDRLFB
représente l'une des 6 faces et le suffixe optionnel '2
représente l'angle de rotation. Ces informations ne sont en aucun cas nécessaires pour résoudre la tâche.
Pour garantir que les brouillages sont de «bonne qualité», les deux règles suivantes doivent s'appliquer:
Deux coups consécutifs ne doivent pas avoir la même lettre. Cela interdit les mouvements consécutifs
UU
,DD
,RR
,LL
,FF
etBB
et toutes les combinaisons possibles en utilisant les suffixes en option commeU2U
ouU'U'
.Ces paires de mouvements sont interdites, car elles peuvent facilement être réduites à 1 ou 0 mouvement.
U2U
a le même effet queU'
,R'R
le même effet que.
Trois coups consécutifs ne doivent pas être du même groupe de lettres. Les groupes de lettres sont
UD
,RL
etFB
. Cette règle interdit en outre les mouvements consécutifsUDU
,DUD
,RLR
,LRL
,FBF
,BFB
et toutes les combinaisons possibles en utilisant les suffixes en option commeU2DU
,RL'R
ouB2FB'
.Les groupes trient les faces selon leur axe de déplacement.
U
etD
sont dans le même groupe, car les deux tournent autour du même axe. Par conséquent, unU
mouvement n'influence pas les morceaux duD
visage, et unD
mouvement n'influence pas les morceaux duU
visage. Par conséquent, les deux mouvements peuvent être échangés,UDU
ont le même effet queUUD
, et cela peut être réduit àU2D
.
Défi
Écrivez un script ou une fonction, qui génère un brouillage aléatoire. Il n'y a aucune entrée. Le script / la fonction doit imprimer les 25 mouvements sans séparation ou séparés par un espace ou retourner la chaîne correspondante.
Votre programme doit être capable de créer chaque brouillage unique, ce qui satisfait aux règles ci-dessus. Bien sûr, en supposant que le générateur de nombres aléatoires est vraiment aléatoire et non pseudo aléatoire.
C'est du code-golf. Le code le plus court (compté en octets ) l'emporte.
Exemples de sorties:
Appeler le script / la fonction 3 fois devrait imprimer / retourner quelque chose comme:
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
Si vous séparez les mouvements par un espace chacun:
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'
Notez que toutes ces sorties se composent de 25 mouvements, mais ont des longueurs différentes, en raison des suffixes facultatifs. Il n'est pas autorisé d'imprimer un espace lorsque l'un 2
ou l' autre ou '
sont utilisés comme suffixe. Vous devez imprimer L2UR2F'R'U2
ou L2 U R2 F' R' U2
. L2U R2F'R'U2
n'est pas autorisé.
UR 2
n'est pas autorisé?U R2
devrait être autorisé, je pense, car les espaces entre les mouvements ont du sens.L2U R2F'R'U2
.U
n'a pas de suffixe facultatif et ne devrait donc pas avoir d'espace. Un espace ne doit pas remplacer le suffixe facultatif.U F2 L D2 R'...
, par exemple? Dans ce cas, il n'y a pas d' espace supplémentaire , ce qui devrait être correct selon votre règle.Réponses:
CJam,
4745 octetsCette solution utilise une approche différente de toute autre publication jusqu'à présent. Il profite des opérations de liste concises de CJam pour générer la liste de coups disponible et en sélectionner une au hasard à chaque itération. Les modificateurs sont simplement générés indépendamment.
Essayez-le en ligne.
Explication
la source
C, 129
La boucle interne génère une valeur de
m
dans la plage1..5
qui, lorsqu'elle est ajoutée às
et prise en modulo 6, garantit qu'il n'y a pas deux mouvements consécutifs du même côté du cube. L'ancienne valeur dem
est stockée dansn
et le testm*n==9
garantit que la valeurm
= 3 n'est jamais générée deux fois de suite (les faces opposées ne peuvent donc pas être sélectionnées deux fois de suite; notez l'ordre des faces dans la chaîne.)La partie la moins significative de
r
est utilisée pour décider du suffixe ('
,2
ou null) à utiliser, en profitant du caractère nul à la fin de"'2"
.La boucle extérieure s'exécute 26 fois. La première fois,
U
ne peut jamais être sélectionnée, elleprintf
est donc supprimée pour la première itération.Code non golfé dans le programme de test
Le code non golfé met un espace entre chaque mouvement pour plus de clarté (le code golfé ne le fait pas, afin d'économiser un octet.) De plus, le code golfé enregistre un point-virgule en déplaçant le
printf
dans lafor
parenthèse.Sortie typique
la source
Pyth,
6566Je n'ai jamais vraiment joué au golf en Pyth, j'ai peut-être écrit un programme ou deux. Il s'agit essentiellement de la solution de @ steveverrill traduite en Pyth. Les suggestions d'amélioration sont les bienvenues.
Mise à jour: ajout d'un octet pour que les brouillages commencent également
U
. Peut-être que la solution C s'appuie sur un comportement indéfini pour le faire fonctionner ...Je pense que cela devrait être fait avec moins d'affectations, mais cela nécessiterait que je modifie beaucoup l'algorithme. (Eh bien, pourrait essayer.)
Voici une explication basée sur le code C:
la source
Y
etZ
.Z
est préinitialisé avec 0, vous enregistrez donc les 3 premiers caractères.n = m
(3e ligne d'explication), ce qui doit signifiern = 0
la première fois, ce qui à son tour devraitY
être de 0.Y
est préinitialisé avec une liste vide[]
. Et je ne pense pas que la valeur desn
choses dans la première itération.U
.JavaScript (ES6) 175
178 204Modifiez 3 octets de moins, 1 en changeant le code et 2 en changeant la façon dont les octets sont comptés (sans compter
F=
)Le code pour éviter les répétitions est tiré de @stevemiller. Sa façon de gérer les groupes de lettres est encore meilleure, mais je ne vais pas la voler.
Bonus: vous pouvez éventuellement spécifier le nombre de coups.
Moins golfé
Tester
la source
Javascript - 112
la source
Java 8,
189183 octetsPort de la réponse C de @LevelRiverSt . J'ai essayé certaines choses moi-même, mais c'était plus court que ce que j'avais ..
Essayez-le en ligne.
la source
Rubis ,
11610710595 octetsEssayez-le en ligne!
la source
Clojure, 223 octets
Cela repose fortement sur le modèle "séquence -> partition par -> filtre -> concat", il est utilisé pour filtrer les séquences de visages "illégales". Cette séquence est ensuite mise en correspondance avec une chaîne avec un suffixe aléatoire (y compris la chaîne vide).
Point de départ non golfé:
la source