Nous pouvons représenter un Rubik's Cube comme un filet comme suit (une fois résolu):
WWW
WWW
WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
YYY
YYY
YYY
Chaque lettre représente la couleur correspondante ( W
blanc, G
vert, etc.)
Il a été démontré qu'il existe exactement (~ quintillions) de permutations différentes dans lesquelles un Rubik's Cube peut se trouver.
Votre tâche consiste à prendre un entier compris entre et et à générer la permutation correspondante, de la manière indiquée ci-dessus. Vous pouvez choisir la façon dont les permutations sont ordonnées, mais l'algorithme que vous utilisez doit être montré pour générer une permutation unique et correcte pour chaque entrée possible.
Règles de permutation non valides
Tiré de cette page
Pour commencer, le centre de chaque face 3x3 doit rester le même, car le carré central d'un Rubik's Cube ne peut pas être tourné. Le cube entier peut être tourné, changeant où une face semble se trouver, mais cela n'affecte pas le filet du cube.
Si nous disons que chaque permutation a une parité, basée sur la parité du nombre de swaps pour atteindre cette permutation, nous pouvons dire
Chaque pièce d'angle a trois orientations possibles. Il peut être orienté correctement (0), dans le sens horaire (1) ou antihoraire (2). La somme des orientations des coins reste toujours divisible par 3
Chaque rotation légale sur le Rubik's Cube retourne toujours un nombre pair d'arêtes afin qu'il ne puisse y avoir qu'une seule pièce mal orientée.
Compte tenu de la permutation de tous les coins et bords, la parité globale doit être paire, ce qui signifie que chaque mouvement légal effectue toujours l'équivalent d'un nombre pair de swaps (en ignorant l'orientation)
Par exemple, les trois réseaux suivants sont des sorties non valides:
WWW
WWW
WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
YYY
YYY
YYY
(Too many whites/not enough reds)
WRW
WRW
WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
YYY
GGY
YYY
(There are two red/green center squares and no white/yellow center squares.
In all valid permutations, the center squares are all different colours)
WWW
WWW
WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
YYY
YYY
YYB
(The yellow/orange/blue corner is rotated into an impossible permutation)
Règles
- Vous devez prouver, comme vous le souhaitez, que l'algorithme est valide. Vous n'avez pas à énumérer chaque permutation, tant que vous prouvez la validité de votre algorithme.
- Vous devez inclure une sorte de preuve de validité dans votre réponse. Cette preuve peut prouver la validité dans n'importe quelle méthode de preuve acceptée, sauf pour énumérer toutes les possibilités.
- Vous pouvez choisir d'utiliser une autre méthode de saisie si vous le souhaitez, tant que:
- L'entrée est bornée
- Chaque entrée correspond à une sortie unique
- Vous expliquez clairement le format d'entrée et comment il correspond à chaque sortie
- Vous pouvez modifier les caractères utilisés pour utiliser 6 caractères ASCII différents, entre 33 (
!
) et 126 (~
), au lieu deWGRBOY
- Vous pouvez sortir de la manière que vous souhaitez, tant qu'il forme une représentation claire d'un cube où les 6 faces peuvent être affichées, y compris n'importe quel filet de cube valide, une chaîne simple ou un rendu 3D. Si vous n'êtes pas sûr d'un format spécifique, n'hésitez pas à demander dans les commentaires.
Il s'agit d'un code-golf donc le code le plus court, en octets, dans chaque langue l'emporte.
Exemples de sorties valides
YYY
YYY
YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
WWW
WWW
WWW
(The `W` and `Y` faces have been swapped)
ZZZ
+++
+}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
7bb
[7Z
[7Z
(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
Then, the moves L, R, U and F' have been applied, in that order.
Notice that each centre square is different, and corresponds to the same colour as in the mapping)
la source
Réponses:
Fusain ,
334297 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Saisissez l'entier dans la variable
q
.Divisez
q
par 3⁷, en mettant le restee
. Puis, en considérante
comme un nombre en base 3, suffixez un chiffre àe
pour que ses chiffres (en base 3) totalisent un multiple de 3. Cela permete
de définir les rotations des coins.Divisez
q
par 8 !, en mettant le restez
. (8! Est temporairement stockéd
pour enregistrer un octet.) Cela permetz
de définir les positions des coins.Divisez
q
par 2¹¹, en mettant le resteh
. Puis, en considéranth
comme un nombre en base 2, suffixez un chiffre àh
pour que ses chiffres (en base 2) totalisent un multiple de 2. Cela permeth
de définir les retournements des bords.Boucle sur une représentation sous forme de chaîne des centres.
Sautez à la position de chaque centre et imprimez-le.
Gardez une trace de la parité des positions de coin en variable
w
.Créez un tableau de positions d'angle.
Créez un tableau de couleurs d'angle.
Boucle deux fois, une fois pour les coins, une fois pour les bords, ci-après dénommés "cubes".
Faites une boucle sur le tableau des couleurs du cube.
Extrayez la position de cube suivante de
z
, en mettant à jour la parité dansw
. Utilisez cette parité pour le dernier mais un bord. Cela garantit que la somme de la parité des bords et des coins est uniforme.Imprimez le cube à cette position, ajusté pour la rotation suivante ou retournez selon le cas.
Retirez la rotation ou le retournement de
e
.Créez un tableau de positions de bord. Ce sera utilisé la deuxième fois dans la boucle.
Créez un tableau de couleurs de bord.
Remplacez les variables de coin
z
ete
les variables de bord correspondantesq
et deh
sorte que les bords soient permutés et inversés lors du deuxième passage de la boucle.la source
Ruby ,
570408 octetsEssayez-le en ligne!
Version originale, avec des tableaux de nombres magiques au lieu de chaînes magiques
Essayez-le en ligne!
Une fonction anonyme qui, dans sa forme actuelle, prend une entrée de deux nombres entiers, ce qui semble être autorisé: "vous pouvez choisir une autre méthode de saisie". La première est la permutation dans la plage de 0 à
12!*8!/2 - 1
et la seconde est l'orientation des pièces dans la plage de 0 à2**11 * 3*7 - 1
. La sortie à l'état résolu est la chaîne suivante:Golf supplémentaire
Il y a environ 10 caractères supplémentaires à enregistrer en ajustant le format de sortie à la forme suivante. Mais cela réduirait la lisibilité, donc je ne le ferai pas pour le moment
Explication
Permutation
En interne, l'état résolu est représenté par la série de nombres octaux dans le tableau
a
. L'entréeg
est divisée par les nombres,12..1
le module étant utilisé pour sélectionner et retirer un borda
et le placerz
. Une fois cela fait, seuls les coins restenta
, doncg
est divisé par les nombres8..1
avec le module utilisé pour retirer un coina
et le placer dedansz
.Comme il n'y a pas d'informations suffisantes pour déterminer l'ordre des deux derniers virages, la valeur de
g
aura été divisée à zéro au moment où elle les atteindra, ils seront donc toujours ajoutész
dans leur ordre d'origine. Une vérification est ensuite effectuée pour déterminer si la permutation globale est paire ou impaire, et si nécessaire, les deux derniers coins sont inversés pour rendre la permutation uniforme.Orientation
Il existe différentes manières de décider si un coin ou une arête est dans la bonne orientation s'il n'est pas à son emplacement résolu. Aux fins de cette réponse, un coin est considéré dans son orientation correcte s'il apparaît
0
ou1
sur la face supérieure ou inférieure. Par conséquent, la rotation de la face supérieure ou inférieure ne modifie pas l'orientation des coins. La rotation des autres faces modifie l'orientation, mais de telle manière que la somme de parité globale reste inchangée. Les bords sont considérés dans le bon sens s'ils montrent un2
ou4
vers l'avant / arrière ou un3
ou5
vers la gauche / droite. Cela signifie que la rotation du haut ou du bas d'un quart de tour inverse les quatre bords mais la rotation des autres faces laisse le statut de retournement inchangé.L'entrée contient des informations explicites pour tous sauf le premier bord et le dernier coin. Les 11 bits les moins significatifs
h%2048
sont additionnés et le module utilisé pour déterminer l'orientation du premier bord.h
est multiplié par 2 en l'ajoutant à lui-même et la valeur de l'orientation du premier bord est ajoutée en tant que bit le moins significatif. L'orientation du dernier coin est trouvée en soustrayant progressivement l'orientation des autres coins dej
. Pour le tout dernier coin (oùi/19
=1
) la valeur dej%3
est ajoutée àh
(qui aura été réduite à zéro) et cela détermine l'orientation du dernier coin.La chaîne
b
est préinitialisée avec le texte pour les centres des visages.h
est divisé par2
douze fois puis par3
huit fois, les modules étant utilisés pour déterminer l'orientation des pièces. Dans chaque cas, le nombre enz
est converti en une chaîne avec le nombre approprié de chiffres (2 ou 3) et la chaîne est ensuite dupliquée. Cela permet à la rotation correcte des chiffres trouvée par le modulo d'être extraite de la chaîne par indexation et ajoutée àb
Afficher
Enfin, les autocollants bruts sont copiés
b
dans un format plus lisible par l'homme ens
utilisant les nombres magiques dans la table d'index.la source