Un cube de Rubik standard, résolu, 3 × 3 × 3 a 6 faces de couleurs différentes, où chaque face est une grille 3 × 3 de carrés d'une couleur. Le visage blanc est opposé au jaune, le rouge opposé à l'orange, le bleu opposé au vert et, lorsque le blanc pointe vers le haut, le rouge est à gauche du bleu:
Imaginez une fourmi assise sur le carré central du visage blanc, face au visage rouge. Vous pouvez lui donner 3 commandes:
- Forward (
^
) - faites un pas dans la direction dans laquelle il se dirige vers le prochain carré de la grille, en passant par-dessus un bord du cube si nécessaire. - Right (
>
) - faites pivoter le curseur vers la droite (dans le sens des aiguilles d'une montre) de 90 °, tout en restant dans le même carré de la grille. - Left (
<
) - fait pivoter de 90 ° vers la gauche (dans le sens inverse des aiguilles d'une montre) en restant dans le même carré de la grille.
À partir d’une liste de commandes arbitraire, trouvez les couleurs des carrés visités par la fourmi (sans compter le carré blanc au début).
Par exemple, la séquence de commandes
^^>^^<^^^
a un chemin qui ressemble à ceci:Les couleurs des carrés de la grille visités dans l’ordre, sans compter le carré de départ, sont
white red red green green green yellow
ou sont simplementwrrgggy
.
Ecrivez un programme ou une fonction qui prend une chaîne de caractères de commande <^>
et imprime ou retourne une chaîne de caractères wyrobg
(blanc, jaune, rouge orange, bleu, vert) qui correspond au chemin de la fourmi sur le cube.
Le code le plus court en octets gagne. Tiebreaker est une réponse plus tôt.
Remarques
- Le cube est dans les airs et la fourmi a des pulvilli efficaces, ce qui lui permet de parcourir l’ensemble du cube.
- Le cube reste toujours dans son état résolu.
- La couleur d'un carré n'est enregistrée que lors de son déplacement dans le carré, pas de rotation. Le carré blanc de départ ne doit pas être enregistré.
- Une seule nouvelle ligne de fin facultative peut être présente dans l'entrée et / ou la sortie.
Cas de test
input : output
[empty string] : [empty string]
^ : w
< : [empty string]
> : [empty string]
><><<<>> : [empty string]
>^ : w
<<^> : w
^<^<^<^< : wwww
^^ : wr
<^^ : wb
>><<<<^^ : wo
<^^^<^^^^<>^>^^>^ : wbbboooggyo
^^^^^^^^^^^^^^ : wrrryyyooowwwr
<<<^<^>^<^<^<^>^^^^<^>>>>>^^<^>^^<^>^>^>^>< : wwgrwgggoooobbbbyrby
^^>^^<^^^ : wrrgggy
la source
Réponses:
Perl,
156143134128127125 125120119117113109 octetsInclut +1 pour
-p
Exécuter avec la chaîne de contrôle sur STDIN, par exemple
rubic.pl
:Explication
Ancienne version:
Le défi de cette question est de trouver un système de coordonnées qui facilite le suivi de la position et de la direction de la fourmi et qui permette d'obtenir facilement l'identité du visage.
Le système que j'ai choisi était de mettre des
(x,y)
coordonnées standard sur le visage de la fourmi, de sorte que celle-ci soit toujours orientée dans ley
sens négatif , le centre de la face étant(0,0)
. Alors:Si
y
était déjà-1
la fourmi quittera le visage actuel et passera au suivant. Dans le nouveau système de coordonnées, ilx
conserve sa valeur, maisy'
devient 1.Cela donne un système de coordonnées facile dans une face. J'ai aussi besoin de quelque chose pour les visages eux-mêmes. J'utilise un tableau composé de
Donc, le tableau initial est
(g,b,o,y,r,w)
. Passer à la face suivante correspond à la rotation des 4 derniers éléments, ce qui permet de passer du blanc au rouge(g,b,w,o,y,r)
. Tourner à droite est une permutation des 5 premiers éléments(o,r,b,y,g,w)
. Tourner à gauche est une permutation simulaire, mais peut également être fait en tournant à droite 3 fois, donc en appliquant cette permutation 3 fois. Et ne pas tourner du tout peut également être fait en appliquant la permutation 8 fois. En fait, il est également possible de tourner à droite en appliquant la permutation 5 fois.Sachant cela, le programme est assez simple:
Donc, pour cette dernière instruction, les rotations mènent à la chaîne vide et les pas en avant mènent au visage actuel. Par conséquent,
$_
est remplacé par les visages visités sur chaque étape.la source
@1
morceau est un abus incroyable de ce qui ressemble à une caractéristique de langage horrible.use strict
. Merci pour le modulo 3 au fait.Brachylog , 287 octets
Attend une chaîne contenant les déplacements en tant qu'entrée, et aucune sortie, par exemple
brachylog_main("^^>^^<^^^",_).
, écrirawrrgggy
dans STDOUT.Explication
Code SWI-Prolog équivalent
Si vous ne voulez pas vous occuper du compilateur Brachylog, vous pouvez exécuter cette solution dans SWI-Prolog en utilisant le code suivant (c'est ce qui est généré par le compilateur Brachylog):
la source
PowerShell, 882 octets
Usage
Enregistrez le code dans un script et appelez-le comme ceci à partir de la ligne de commande. En supposant que le répertoire de travail est le répertoire actuel.
Code
Code moins joué avec explication
En utilisant beaucoup de variables d'une seule lettre utilisées pour enregistrer l'état actuel de la fourmi (couleur, position et orientation). La fourmi est toujours tournée vers le haut. Lorsqu'une instruction de rotation est lue, le cube est transposé dans cette direction. Les matrices de transposition codées en dur sont utilisées pour déterminer la nouvelle position en fonction de la position actuelle.
Code satisfait tous les exemples en question.
la source
Tcl / Tk, 422 octets
Hélas, je ne peux pas le réduire. Version non-obscurcie:
Cela fonctionne en maintenant une liste de couleurs de cellules horizontales et verticales. ^ <et> sont toutes des commandes qui permutent correctement les listes. La cellule en cours est la première de chaque liste.
la source
Ruby, 132
Ce système de position est malheureusement très similaire aux autres réponses disponibles.
x
etz
suivez votre position sur le visage actuel avec+x
le sens de la marche. Forward est toujoursx+=1
, et les limites de chaque face sont divisibles par 3 (on se fout du nombre, juste son module avec 3).m
est le visage actuel (cela économise quelques octets)g
est disposé de[left, right, behind, opposite, front]
telle sorte que nous ne devons changerg[0..1]
sur^
<
se fait simplement en faisant>
trois fois.la source
Java,
619605 octetsEh bien, rien ne va ici ...
Au moins, il a battu Powershell!
-14 octets grâce à @KevinCruijssen
Explication:
Contrairement à certaines des autres réponses, qui utilisaient un système de coordonnées 2-D, j’utilisais un système 3-D pour suivre l’emplacement de la fourmi.
La direction a également été maintenue en 3-D pour faciliter le changement de côté et de mouvement.
Chaque face a une des coordonnées, x, y ou z, définie sur 2 (ou -2 pour la face opposée) pour indiquer de quelle face il s’agit.
Pour changer de face, il fallait vérifier si la fourmi était sur le point de s’éteindre (la position et le cap ont la même valeur, mais pas 0), s’assurer qu’elle tomberait en diagonale sur la suivante et changer le cap pour qu’il ne soit pas -diagonale. C'était étonnamment facile.
Tourner était plus difficile. S'assurer qu'il irait toujours dans le même sens nécessitait une déclaration if-else supplémentaire dans la vérification de chaque caractère, ce qui m'a coûté de nombreux octets. De plus, les axes "haut" et "droit" devaient être codés en dur pour chaque côté.
Code non-liquéfié
(Inchangé par rapport à l'édition précédente pour plus de clarté dans la méthode)
la source
d[]={"w","g","r","b","o","y"}
->"w,g,r,b,o,y".split(",")
(-1 octet); 2x'^'
->94
(-2 octets); 3x==0
-><1
(-3 octets); 2x==1
-><2
(-2 octets); etc pour==2
,==3
,==4
,==5
.