Un cube de Rubik a 6 couleurs: rouge, orange, jaune, blanc, bleu et vert. Les faces rouge et orange, jaune et blanche, bleue et verte sont opposées.
Le net d'un cube de Rubik résolu ressemble à ceci:
Y
BRGO
W
Et les carreaux ressemblent à ceci:
Y Y Y
Y Y Y
Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Défi
Avec des rotations, des rotations inversées ou des rotations doubles, le cube résolu sera transformé en art ASCII ou en image (les espaces blancs ne sont pas nécessaires, peuvent exister ou non, les espaces finaux sont autorisés.).
L'entrée sera rotation (et modificateur facultatif). La notation de rotation va comme: U
(p), L
(eft), F
(ront), R
(ight), B
(ack), D
(propre); 2
(double) '
ou i
(inverse).
Toutes les rotations normales seront à 90 ° dans le sens des aiguilles d'une montre, les inverses seront dans le sens contraire des aiguilles d'une montre.
Explication à propos de clockwiseness : Imaginez le cube en regardant le visage rouge et le visage jaune en haut. Ensuite, faites pivoter le cube afin que le visage que le programme fera pivoter soit face à vous. C'est ainsi que fonctionnera l'horloge. (Sauf face arrière, vous ferez pivoter le cube horizontalement dans ce cas.)
Contribution
L'entrée sera une liste de mouvements.
Sortie
Un art ASCII qui représente le cube ou une image du réseau du cube.
Exemples
Entrée : (vide)
Sortie :
Y Y Y
Y Y Y
Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Entrée : U
(en haut)
Sortie :
Y Y Y
Y Y Y
Y Y Y
R R R G G G O O O B B B
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Entrée : U'
ou Ui
(inverse vers le haut)
Sortie :
Y Y Y
Y Y Y
Y Y Y
O O O B B B R R R G G G
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Entrée : U2
(double up)
Sortie :
Y Y Y
Y Y Y
Y Y Y
G G G O O O B B B R R R
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Entrée : L'
(inversé à gauche)
Sortie :
R Y Y
R Y Y
R Y Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
O W W
O W W
O W W
Entrée : R
(droite)
Sortie :
Y Y R
Y Y R
Y Y R
B B B R R W G G G Y O O
B B B R R W G G G Y O O
B B B R R W G G G Y O O
W W O
W W O
W W O
Entrée : U2 L' D
(double en haut, inverse gauche, en bas)
Sortie :
O Y Y
R Y Y
R Y Y
G B B W O O B B B R R Y
G B B W R R G G G O O Y
O O Y G B B W R R G G G
R O O
W W W
W W W
Règles
- Aucune échappatoire autorisée.
- C'est du code-golf , donc le code le plus court d'octets résolvant le problème gagne.
S
,E
,M
,x
,y
,z
,u
/Uw
,d
/Dw
,r
/Rw
,l
/Lw
,f
/Fw
,b
/Bw
se déplace aussi bien? Ou seulement la valeur par défaut:U
,D
,R
,L
,F
,B
et leur variante anti - horaire avec apostrophe ('
)? Hors sujet: Je me pose toujours des questions sur les questions de Rubik's Cube. Êtes-vous également un collectionneur de Twisty Puzzles?Réponses:
Ruby,
370 339305 octetsDernière édition: quelques octets enregistrés en réorganisant les formules de traçage et en supprimant les crochets inutiles. Une économie énorme en réécrivant la génération du cube - je n'avais jamais su que Ruby avait une fonction intégrée pour les produits cartésiens!
Fonction anonyme.
Accepte un tableau de chaînes, chacune représentant un tour de visage (une seule chaîne avec des espaces entre chaque tour de visage correspond à 6 octets supplémentaires.)
Retourne une chaîne rectangulaire de 9x12.
Brève explication
Ceci est étroitement basé sur un concept de ma réponse à cette question , qui à son tour était basée sur un concept similaire de Jan Dvorak.
La première ligne génère un tableau de 27 éléments représentant les 27 cubes. Chaque compartiment est représenté par un vecteur tridimensionnel dans lequel le signe représente sa position actuelle et la magnitude de chaque coordonnée représente le code ASCII pour la couleur de l'autocollant.
Exemple de déplacement: pour R, pour chaque groupe, vérifiez si la coordonnée x est> 0 et si c'est le cas tournez à 90 degrés en permutant les coordonnées y et z et en échangeant le signe de l'un d'eux.
Prenez un tableau d'espaces 9x12 et tracez-y le cube. Pour chaque groupe et chaque axe, nous vérifions si l'autocollant existe (coordonnée dans cet axe différent de zéro) et déterminons où il va aller. Ensuite, nous prenons la coordonnée et effectuons
.abs.chr
pour changer le nombre dans le caractère requis et le traçons.Non testé dans le programme de test (par modification de 339 octets)
Sortie
la source
Javascript (ES5), 1615 octets
Ungolfed:
C'était un défi très difficile.
Explication
Prenons l'exemple d'appel
s("R U' F")
.Le programme ne peut exécuter que des déplacements x, y et R.
U'
est égal àU U U
, alors remplacez cela.F
est égal ày y y R y
, alors remplacez cela.R U' F'
est donc égal àR U U U y y y R y
, que le programme peut exécuter.cstate est défini avec un cube résolu. Un cube est représenté par un tableau contenant 6 tableaux contenant les 9 autocollants. Le premier tableau est pour R, le second pour U, le troisième pour F, D, B, le dernier tableau est pour L. Quand un y doit être exécuté, le programme échange les quatre tableaux des faces avant, gauche, arrière et droite. Pour un x, il bascule avant, bas, arrière et haut. Chaque rotation fait également pivoter les autres faces, qui n'ont pas été échangées. Le mouvement AR fait pivoter le visage droit et échange la partie droite du front, du haut, du dos et du bas.
Cela pourrait être modifié pour pouvoir résoudre les problèmes avec tous les types de mouvements, en les définissant avec x, y et R.
la source
R U' F2
se convertit enR U' F F
premier, puisR U U U F F
, ensuite,R x y R y y y x x x x y R y y y x x x x y R y y y x x x y y y R y y y y R y
qu’il exécute? Bizarre .. mais très original. +1 :) Comment avez-vous eu cette idée?U'
enU U U
trop, maisx
es ety
s sont vraiment bons. Je veux voler ça aussi: p'
et2
, puis remplace tous les mouvements.C,
17151709168613361328 octets25 octets sauvés grâce à @KevinCruijssen!
Aucune réponse à ce jour, j'ai donc décidé de mettre ma propre solution.
Essayez-le en ligne!
Ancienne version non-golfée:
la source
for(b=1;b<8;b++)for(a=1;a<11;a++)r[b][a]=c[b];
tofor(b=1;b<8;)for(a=1;a<11;)r[b][a++]=c[b++];
andfor(i=1;i<=9;i++)
tofor(i=0;++i<=9;)
, and some of the other for-loops as well. Also, theelse if
can be changed to justif
when you checkif(d==66)B(r);if(d==76)L(r);...
And, unlessi
can be negative, you can changeif(i%3==0)
toif(i%3<1)
two times. And I'm sure it can be golfed some more. Nice to see an answer on your own challenge, though. :)if
s andi
though, I'll edited them once I go home. Thanks!else
s bork the program, golfing loops bork the program, the thing withi
works. Thanks anyway.else if
changing toif
fail? :S In each of theelse if
s you compared==##
, so I'm confused why it doesn't. Again, I don't program C, so maybe I'm missing something obvious that C can't do, but still.. Ah well, glad I could help with the modulo<1
instead of==0
Python 3,
610 563 533526 bytes-7 bytes thanks to my colleague rhsmits (really nice
d,*c
form & removal of redundant parentheses)This is a full program.
Superflip and all tests are available at ideone or Try it online!
The program:
YBRGOW
of stickers.r
, which only rotates the stickers on a face, clockwise a quarter-turnU
, which rotates theU
face clockwise a quarter-turn by applyingr
and rotating the stickers on the top-band ofLFRB
clockwise a quarter-turny
, which performsr
on theU
andD
faces and slicesLFRB
- this performs a rotation of the whole cube in the
y
axis (which runs throughU
andD
)- the rotation is clockwise if looking from above
z
, which performs a rotation of the whole cube in thez
axis clockwise a quarter turn looking atR
(the axis runs throughR
andL
) - this time because the way the faces are oriented in our net (same as given in the OP) we have to flip theB
andU
faces over (they switch from the horizontal to vertical parts of the net and vice-versa)input()
, (the moves to be performed) matching a character fromBUDLRF
(actuallyB-U
) possibly followed by a character'i2
'i2
to the number of clockwise turns (the ordinals of these mod6
does the job, with a dummya
to yield1
when none is present)y
andz
, a quarter-turn ofU
(which will now be the face instructed), and then the calls to inverse the sequence of the setup performed. Taking the ordinal of the face character modulo by11
then by7
mapsB:0 U:1 D:2 L:3 F:4 R:5
, allowing a simple indexing into a string of the function name sequences split by spaces.d
to shorten the printingU
andD
Here is the superflip:
la source
Python
760750649 Bytesshamelessly stole the idea of using only 3 rotations from @Paul Schmitz :D
new version:
I mostly just did lots of numpy list slicing and used its built in rotate and roll functions. Input is handled by calling the functions directly with
eval()
ungolfed..
test input:
Comments or suggestions are greatly appreciated :)
la source
of using only 3 rotations
wrong. The program converts any sequence into a sequence with more moves. If you inputF F F F
, it uses more than 3 rotations, as it converts toy y y R y y y y R y y y y R y y y y R y
. It uses three types of rotations.C, 839 bytes
As this is not a full program (function with input from a string argument and output to the console), you need to call it like this:
Use only one call at a time as the function uses and modifies global variables.
Ungolfed:
As you can see, the main idea is to use a fully data-driven approach: The different rotations are expressed as lists of indices that have to be permuted. The permutation code can thus be very short and generic.
la source
f(h,g)int*g;{
-2,l(g,m){
-8,n(char*o){
-5,printf("%s",a)
toputs(a)
-7, also you can replace char constants with their ASCII decimal representation -1 eachCubically, 2 bytes
Try it online!
Explanation:
If extraneous output is allowed, this is an alternative. 1 byte:
Try it online!
Cubically automatically dumps its memory cube to
STDERR
when the program ends. However, it also prints the notepad beforehand.la source
+1
JavaScript (ES6), 820
A porting of the buggy answer by @Paul Schmitz. It's still not completely golfed, but it has the added value that it works.
The main problem in the original answer is that a single function Q is not enough for all the movements involved in a rotation. I had to add 2 other functions O and N. All of them are just called in the right rotation function R.
More readable maybe
la source
update()
is not defined in my console while running the snippet