El cubo de Rubik tiene 6 colores: rojo, naranja, amarillo, blanco, azul y verde. Las caras roja y naranja, amarilla y blanca, y azul y verde están en lados opuestos.
La red de un cubo de Rubik resuelto se ve así:
Y
BRGO
W
Y los azulejos se ven así:
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
Reto
Las rotaciones dadas, las rotaciones invertidas o las rotaciones dobles generan lo que un cubo resuelto se transformará, como arte ASCII o como imagen (los espacios en blanco no son necesarios, pueden existir o no, se permiten espacios en blanco finales).
La entrada será rotación (y modificador opcional). La notación de rotación es como: U
(p), L
(eft), F
(ront), R
(ight), B
(ack), D
(own); 2
(doble) '
o i
(inverso).
Todas las rotaciones normales serán 90 ° en sentido horario, las inversas serán en sentido antihorario.
Explicación sobre el sentido de las agujas del reloj : imagina el cubo mientras miras la cara roja, y la cara amarilla está en la parte superior. Luego, gire el cubo de modo que la cara que rotará el programa lo mire. Esta es la forma en que funcionará en sentido horario. (Excepto la cara posterior, rotará el cubo horizontalmente en ese caso).
Entrada
La entrada será una lista de movimientos.
Salida
Un arte ASCII que representa el cubo o una imagen de la red del cubo.
Ejemplos
Entrada : (vacía)
Salida :
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
Entrada : U
(arriba)
Salida :
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
Entrada : U'
o Ui
(inversa hacia arriba)
Salida :
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
Entrada : U2
(doble)
Salida :
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
Entrada : L'
(invertido a la izquierda)
Salida :
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
Entrada : R
(derecha)
Salida :
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
Entrada : U2 L' D
(doble arriba, inversa izquierda, abajo)
Salida :
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
Reglas
- No se permiten escapatorias.
- Este es el código de golf , por lo que gana el código más corto en bytes que resuelve el problema.
S
,E
,M
,x
,y
,z
,u
/Uw
,d
/Dw
,r
/Rw
,l
/Lw
,f
/Fw
,b
/Bw
se mueve así? O sólo el defecto:U
,D
,R
,L
,F
,B
y su variante de la izquierda con apóstrofe ('
)? Fuera de tema: siempre me pregunto con las preguntas relacionadas con el cubo de Rubik, ¿también eres un coleccionista de Twisty Puzzles?Respuestas:
Rubí,
370339305bytesÚltima edición: algunos bytes guardados por la reorganización de las fórmulas de trazado y la eliminación de paréntesis innecesarios. Un ahorro masivo al reescribir la generación del cubo: ¡nunca supe que Ruby tenía un producto incorporado para productos cartesianos!
Función anónima.
Acepta una serie de cadenas, cada una de las cuales representa una vuelta de cara (una sola cadena con espacios entre cada vuelta de cara tiene 6 bytes adicionales).
Devuelve una cadena rectangular de 9x12.
Breve explicacion
Esto se basa estrechamente en un concepto de mi respuesta a esta pregunta , que a su vez se basó en un concepto similar de Jan Dvorak.
La primera línea genera una matriz de 27 elementos, que representa los 27 cubos. Cada cubo está representado por un vector tridimensional en el que el signo representa su posición actual y la magnitud de cada coordenada representa el código ASCII para el color de la etiqueta.
Ejemplo de movimiento: para R, para cada cubito verifique si la coordenada x es> 0 y, de ser así, gire 90 grados intercambiando las coordenadas y y z e intercambiando el signo de una de ellas.
Tome una matriz de espacios de 9x12 y trace el cubo en él. Para cada cubo y eje, verificamos si la pegatina existe (coordenada en ese eje distinta de cero), y determinamos dónde debe ir. Luego tomamos la coordenada y la realizamos
.abs.chr
para cambiar el número al carácter requerido y trazarlo.Sin golf en el programa de prueba (por edición de 339 bytes)
Salida
fuente
Javascript (ES5), 1615 bytes
Sin golf:
Este fue un desafío muy difícil.
Explicación
Tome la llamada de ejemplo
s("R U' F")
.El programa solo puede ejecutar movimientos x, y y R.
U'
es igual aU U U
, así que reemplace eso.F
es igual ay y y R y
, así que reemplace eso.R U' F'
es, por lo tanto, igual a loR U U U y y y R y
que el programa puede ejecutar.cstate se define con un cubo resuelto. Un cubo está representado por una matriz que contiene 6 matrices que contienen las 9 pegatinas. La primera matriz es para R, la segunda para U, la tercera para F, D, B, la última matriz es para L. Cuando se necesita ejecutar y, el programa intercambia las cuatro matrices de la cara frontal, izquierda, posterior y derecha. Para una x, intercambia delante, abajo, atrás y arriba. Cada rotación también gira las otras caras, que no se intercambiaron. El movimiento AR gira la cara derecha y cambia la parte derecha de la cara frontal, superior, posterior y inferior.
Esto podría modificarse para poder resolver problemas con todo tipo de movimientos, definiéndolos con x, y y R.
fuente
R U' F2
se convierteR U' F F
primero, luegoR U U U F F
, y luegoR 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é se ejecuta? Raro ... pero muy original. +1 :) ¿Cómo se te ocurrió esta idea?U'
enU U U
demasiado, perox
es yy
s son muy buenos. Quiero robar esto también: p'
y2
, y luego reemplaza todos los movimientos.C,
17151709168613361328 bytes¡25 bytes guardados gracias a @KevinCruijssen!
No hay respuestas hasta ahora, así que decidí poner mi propia solución.
Pruébalo en línea!
Versión antigua sin golf:
fuente
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;)
, y algunos de los otros for-loops también. Además,else if
se puede cambiar a soloif
cuando marcaif(d==66)B(r);if(d==76)L(r);...
Y, a menosi
que sea negativo, puede cambiarif(i%3==0)
aif(i%3<1)
dos veces. Y estoy seguro de que se puede jugar un poco más. Sin embargo, es bueno ver una respuesta a tu propio desafío. :)if
syi
, sin embargo, los editaré una vez que me vaya a casa. ¡Gracias!else
s bork el programa, los bucles de golf bork el programa, lo quei
funciona. Gracias de cualquier manera.else if
cambioif
? : S En cada uno de loselse if
s que comparad==##
, así que estoy confundido por qué no lo hace. Una vez más, no programo C, así que tal vez me estoy perdiendo algo obvio que C no puede hacer, pero aún así ... Ah, bueno, me alegro de poder ayudar con el módulo en<1
lugar de==0
Python 3,
610 563 533526 bytes-7 bytes gracias a mi colega rhsmits (muy buena
d,*c
forma y eliminación de paréntesis redundantes)Este es un programa completo.
Superflip y todas las pruebas están disponibles en ideone o ¡ Pruébelo en línea!
El programa:
YBRGOW
de las pegatinas.r
, que solo gira las pegatinas en una cara, en el sentido de las agujas del reloj un cuarto de vueltaU
que gira laU
cara en sentido horario un cuarto de vuelta aplicandor
y girando las pegatinas en la banda superior de lasLFRB
agujas del reloj un cuarto de vueltay
que realizar
en losU
yD
caras y rebanadasLFRB
- Esto realiza una rotación de todo el cubo en el
y
eje (que corre a través deU
yD
)- la rotación es en sentido horario si mirando desde arriba
z
, que realiza una rotación de todo el cubo en elz
eje en el sentido de las agujas del reloj un cuarto de vuelta mirandoR
(el eje atraviesaR
yL
), esta vez debido a la forma en que las caras están orientadas en nuestra red (igual que en el OP) tienen que voltearB
yU
caras (cambian de las partes horizontales a verticales de la red y viceversa)input()
(los movimientos a realizar) que coinciden con un personaje deBUDLRF
(en realidadB-U
) posiblemente seguido por un personaje'i2
'i2
número de giros en el sentido de las agujas del reloj (los ordinales de estos mod6
hacen el trabajo, con un ficticioa
para ceder1
cuando no hay ninguno)y
yz
un cuarto de vuelta deU
(que ahora será la cara indicada), y luego las llamadas para invertir la secuencia de la configuración realizada. Tomando el ordinal del módulo de caracteres de la cara para11
entonces mediante7
mapasB:0 U:1 D:2 L:3 F:4 R:5
, lo que permite una indexación simple en una cadena de secuencias de nombres de funciones divididas por espacios.d
para acortar la impresiónU
yD
Aquí está el superflip :
fuente
Pitón
760750649 bytesrobó descaradamente la idea de usar solo 3 rotaciones de @Paul Schmitz: D
nueva versión:
La mayoría de las veces solo hice muchas rebanadas de listas numpy y utilicé sus funciones integradas de rotación y giro. La entrada se maneja llamando a las funciones directamente con
eval()
sin golf ..
entrada de prueba:
Los comentarios o sugerencias son muy apreciados :)
fuente
of using only 3 rotations
incorrecto. El programa convierte cualquier secuencia en una secuencia con más movimientos. Si ingresaF F F F
, usa más de 3 rotaciones, ya que se convierte ay y y R y y y y R y y y y R y y y y R y
. Utiliza tres tipos de rotaciones.C, 839 bytes
Como este no es un programa completo (función con entrada de un argumento de cadena y salida a la consola), debe llamarlo así:
Use solo una llamada a la vez ya que la función usa y modifica variables globales.
Sin golf:
Como puede ver, la idea principal es utilizar un enfoque totalmente basado en datos: las diferentes rotaciones se expresan como listas de índices que deben permutarse. El código de permutación puede ser muy corto y genérico.
fuente
f(h,g)int*g;{
-2,l(g,m){
-8,n(char*o){
-5,printf("%s",a)
aputs(a)
-7, también puede reemplazar las constantes de caracteres con su representación decimal ASCII -1 cada unoCúbicamente , 2 bytes
Pruébalo en línea!
Explicación:
Si se permite una salida extraña, esta es una alternativa. 1 byte:
Pruébalo en línea!
Vuelca automáticamente su cubo de memoria
STDERR
cuando finaliza el programa. Sin embargo, también imprime el bloc de notas de antemano.fuente
+1
JavaScript (ES6), 820
Una portada de la respuesta con errores de @Paul Schmitz. Todavía no está completamente golfizado, pero tiene el valor agregado de que funciona.
El principal problema en la respuesta original es que una sola función Q no es suficiente para todos los movimientos involucrados en una rotación. Tuve que agregar otras 2 funciones O y N. Todas ellas se llaman en la función de rotación derecha R.
Quizás más legible
fuente
update()
no está definido en mi consola mientras