Un Cubo de Rubik 3 × 3 × 3 estándar, resuelto, tiene 6 caras de diferentes colores, donde cada cara es una cuadrícula de cuadrados 3 × 3 de un color. La cara blanca es opuesta al amarillo, el rojo opuesto al naranja, el azul opuesto al verde, y cuando el blanco apunta hacia arriba, el rojo está a la izquierda del azul:
Imagina que una hormiga se sienta en el cuadrado central de la cara blanca, frente a la cara roja. Puedes darle 3 comandos:
- Forward (
^
): da un paso en la dirección que está mirando hacia el siguiente cuadrado de la cuadrícula, pisando un borde del cubo si es necesario. - Derecha (
>
): gire a la derecha (en sentido horario) 90 °, permaneciendo en el mismo cuadrado de la cuadrícula. - Izquierda (
<
): gire a la izquierda (en sentido antihorario) 90 °, permaneciendo en el mismo cuadrado de la cuadrícula.
Dada una lista arbitraria de comandos, encuentra los colores de los cuadrados que visita la hormiga (sin incluir el cuadrado inicial blanco).
Por ejemplo, la secuencia de comandos
^^>^^<^^^
tiene una ruta que se ve así:Los colores de los cuadrados de la cuadrícula visitados en orden, sin contar el cuadrado inicial, son
white red red green green green yellow
, o simplementewrrgggy
.
Escriba un programa o función que tome una cadena de los caracteres del comando <^>
e imprima o devuelva una cadena de los caracteres wyrobg
(blanco, amarillo, rojo anaranjado, azul, verde) que corresponde a la ruta de la hormiga sobre el cubo.
El código más corto en bytes gana. Tiebreaker es la respuesta anterior.
Notas
- El cubo está en el aire y la hormiga tiene pulvilli efectivos, por lo que puede atravesar todo el cubo.
- El cubo siempre permanece en su estado resuelto.
- El color de un cuadrado solo se registra al moverse hacia el cuadrado, no a la rotación. El cuadrado blanco inicial no debe registrarse.
- Una nueva línea final opcional puede estar presente en la entrada y / o salida.
Casos de prueba
input : output
[empty string] : [empty string]
^ : w
< : [empty string]
> : [empty string]
><><<<>> : [empty string]
>^ : w
<<^> : w
^<^<^<^< : wwww
^^ : wr
<^^ : wb
>><<<<^^ : wo
<^^^<^^^^<>^>^^>^ : wbbboooggyo
^^^^^^^^^^^^^^ : wrrryyyooowwwr
<<<^<^>^<^<^<^>^^^^<^>>>>>^^<^>^^<^>^>^>^>< : wwgrwgggoooobbbbyrby
^^>^^<^^^ : wrrgggy
fuente
Respuestas:
Perl,
156143134128127125120119117113109 bytesIncluye +1 para
-p
Ejecutar con la cadena de control en STDIN, p. Ej.
rubic.pl
:Explicación
Versión antigua:
El desafío de esta pregunta es encontrar un sistema de coordenadas que facilite el seguimiento de la posición y la dirección de la hormiga y aún así obtener fácilmente la identidad de la cara.
El sistema que elegí fue poner
(x,y)
coordenadas estándar en la cara en la que está la hormiga de tal manera que la hormiga siempre esté mirando en lay
dirección negativa con el centro de la cara(0,0)
. Entonces:Si
y
ya estaba,-1
la hormiga dejará la cara actual y pasará a la siguiente. En el nuevo sistema de coordenadas,x
mantiene su valor, pero sey'
convierte en 1.Esto proporciona un sistema de coordenadas fácil dentro de una cara. También necesito algo para las caras mismas. Allí uso una matriz que consiste en
Entonces la matriz inicial es
(g,b,o,y,r,w)
. Pasar a la siguiente cara corresponde a rotar los últimos 4 elementos, por lo que pasar de blanco a rojo hace esto(g,b,w,o,y,r)
. Girar a la derecha es una permutación de los primeros 5 elementos que dan(o,r,b,y,g,w)
. Girar a la izquierda es una permutación simular, pero también se puede hacer girando a la derecha 3 veces, por lo que se aplica esta permutación 3 veces. Y no girar en absoluto también se puede hacer aplicando la permutación 8 veces. De hecho, girar a la derecha también se puede hacer aplicando la permutación 5 veces.Sabiendo esto, el programa es bastante simple:
Entonces, para esa última declaración, las rotaciones conducen a la cadena vacía y los pasos hacia adelante conducen a la cara actual. Por lo tanto,
$_
se reemplaza por las caras visitadas en cada paso.fuente
@1
parte es un abuso increíble de lo que parece una característica de lenguaje horrible.use strict
. Gracias por el módulo 3 por cierto.Brachylog , 287 bytes
Espera una cadena que contenga los movimientos como Entrada, y no Salida, por ejemplo
brachylog_main("^^>^^<^^^",_).
, escribiráwrrgggy
en STDOUT.Explicación
Código equivalente de SWI-Prolog
Si no desea molestarse con el compilador de Brachylog, puede ejecutar esta solución en SWI-Prolog usando el siguiente código (esto es lo que genera el compilador de Brachylog):
fuente
PowerShell, 882 bytes
Uso
Guarde el código en un script y llámelo así desde la línea de comandos. Asumiendo que el directorio de trabajo es el directorio actual.
Código
Menos código de golf con explicación
Usando una gran cantidad de variables de una sola letra para registrar el estado actual de la hormiga (color, posición y orientación). La hormiga siempre está mirando hacia arriba. Cuando se lee una instrucción de rotación, el cubo se transpone en esa dirección. Las matrices de transposición codificadas se utilizan para determinar una nueva posición basada en la posición actual.
El código satisface todos los ejemplos en cuestión.
fuente
Tcl / Tk, 422 bytes
Por desgracia, no puedo hacerlo más pequeño. Versión no ofuscada:
Funciona manteniendo una lista de colores de celda horizontales y verticales. ^ <y> son todos los comandos que permutan correctamente las listas. La celda actual es la primera en cada lista.
fuente
Rubí, 132
Lamentablemente, este sistema de posición es muy similar a otras respuestas disponibles.
x
yz
rastrea tu posición en la cara actual con+x
la dirección del viaje. El avance siempre esx+=1
, y los límites de cada cara son divisibles por 3 (no nos importa el número, solo su módulo con 3).m
es la cara actual (esto ahorra algunos bytes)g
está dispuesto[left, right, behind, opposite, front]
de manera que no es necesario para el cambiog[0..1]
de^
<
se hace simplemente haciendo>
tres veces.fuente
Java,
619605 bytesBueno, aquí no pasa nada ...
¡Al menos venció a PowerShell!
-14 bytes gracias a @KevinCruijssen
Explicación:
A diferencia de algunas de las otras respuestas, que usaban un sistema de coordenadas 2-d, yo usaba un sistema 3-d para hacer un seguimiento de dónde estaba la hormiga.
La dirección también se mantuvo en 3-d para facilitar el cambio de lado y movimiento.
Cada cara tenía una de las coordenadas, x, y, o z, configurada en 2 (o -2 para la cara opuesta) para indicar qué cara era.
El cambio de caras se realizó comprobando si la hormiga estaba a punto de estallar (la posición y el rumbo tienen un valor igual, pero no 0), asegúrese de que se "caiga" diagonalmente al siguiente y cambie el rumbo para que no sea -diagonal. Esto fue sorprendentemente fácil.
Girar fue más difícil. Asegurarse de que siempre iría en la misma dirección requería una declaración if-else adicional dentro de la verificación para cada carácter, lo que me costó muchos bytes. Además, los ejes "arriba" y "derecha" tenían que estar codificados para cada lado.
Código sin golf
(Sin cambios desde la edición anterior para mayor claridad en el método)
fuente
d[]={"w","g","r","b","o","y"}
->"w,g,r,b,o,y".split(",")
(-1 byte); 2x'^'
->94
(-2 bytes); 3x==0
-><1
(-3 bytes); 2x==1
-><2
(-2 bytes); etc para==2
,==3
,==4
,==5
.