Su tarea es crear una secuencia aleatoria de movimientos, que se puede utilizar para mezclar un cubo de Rubik. Tal revuelo se compone de exactamente 25 movimientos. Cada movimiento consta de las letras UDRLFB
opcionalmente seguidas de uno de los sufijos '2
.
Esta notación se llama notación Singmaster. UDRLFB
representa una de las 6 caras y el sufijo opcional '2
representa el ángulo de giro. Esta información no es necesaria para resolver la tarea.
Para asegurar que las codificaciones son de "buena calidad", deben aplicarse las siguientes dos reglas:
Dos movimientos consecutivos no deben tener la misma letra. Esto prohíbe los movimientos consecutivos
UU
,DD
,RR
,LL
,FF
yBB
y todas sus combinaciones utilizando los sufijos opcionales comoU2U
oU'U'
.Estos pares de movimientos están prohibidos, ya que pueden reducirse fácilmente a 1 o 0 movimientos.
U2U
tiene el mismo efecto queU'
,R'R
el mismo efecto que.
Tres movimientos consecutivos no deben ser del mismo grupo de letras. Los grupos de letras son
UD
,RL
yFB
. Esta norma, además, prohíbe los movimientos consecutivosUDU
,DUD
,RLR
,LRL
,FBF
,BFB
y todas sus combinaciones utilizando los sufijos opcionales comoU2DU
,RL'R
oB2FB'
.Los grupos ordenan las caras por su eje de movimiento.
U
yD
están en el mismo grupo, porque ambos giran alrededor del mismo eje. Por lo tanto, unU
movimiento no influye en las piezas de laD
cara, y unD
movimiento no influye en las piezas de laU
cara. Por lo tanto, los dos movimientos se pueden intercambiar,UDU
tiene el mismo efecto queUUD
, y esto se puede reducir aU2D
.
Reto
Escriba un script o una función que genere una codificación aleatoria. No hay entrada El script / función tiene que imprimir los 25 movimientos sin separación o separados por un espacio o devolver la cadena correspondiente.
Su programa tiene que poder crear cada codificación, que satisfaga las reglas anteriores. Por supuesto, suponiendo que el generador de números aleatorios es verdaderamente aleatorio y no pseudoaleatorio.
Este es el código de golf. El código más corto (contado en bytes ) gana.
Ejemplos de salidas:
Llamar al script / función 3 veces debería imprimir / devolver algo como:
R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D
Si separas los movimientos por un espacio cada uno:
R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'
Tenga en cuenta que todas estas salidas consisten en 25 movimientos, pero tienen diferentes longitudes, debido a los sufijos opcionales. No está permitido imprimir un espacio, cuando 2
o '
se usan como sufijo. Tienes que imprimir L2UR2F'R'U2
o L2 U R2 F' R' U2
. L2U R2F'R'U2
No se permite.
fuente
UR 2
que no está permitido?U R2
debería permitirse, creo, ya que los espacios entre movimientos tienen sentido.L2U R2F'R'U2
.U
no tiene sufijo opcional y, por lo tanto, no debe tener un espacio. Un espacio no debe ser un reemplazo para el sufijo opcional.U F2 L D2 R'...
, por ejemplo? En este caso, no hay un espacio extra , que creo que debería estar bien de acuerdo con su regla.Respuestas:
CJam,
4745 bytesEsta solución utiliza un enfoque que es diferente de cualquier otro publicado hasta ahora. Aprovecha las operaciones concisas de la lista de CJam para generar la lista de movimiento disponible y seleccionar una al azar en cada iteración. Los modificadores simplemente se generan de forma independiente.
Pruébalo en línea.
Explicación
fuente
C, 129
El bucle interno genera un valor
m
en el rango1..5
que, cuando se agregas
y se toma en el módulo 6, asegura que no haya dos movimientos consecutivos en el mismo lado del cubo. El valor anterior dem
se almacenan
y la pruebam*n==9
garantiza que el valorm
= 3 nunca se genere dos veces seguidas (por lo que las caras opuestas no se pueden seleccionar dos veces seguidas; observe el orden de las caras en la cadena).La parte menos significativa de
r
se utiliza para decidir que el sufijo ('
,2
o null) para uso, aprovechando el carácter nulo al final de"'2"
.El bucle externo se ejecuta 26 veces. La primera vez,
U
nunca se puede elegir, por lo queprintf
se suprime para la primera iteración.Código no protegido en el programa de prueba
El código sin golf pone un espacio entre cada movimiento para mayor claridad (el código con golf no lo hace, para ahorrar un byte). Además, el código con golf ahorra un punto y coma al reubicar el
printf
dentro delfor
soporte.Salida típica
fuente
Pyth
sesenta y cinco66Realmente nunca he jugado golf en Pyth, quizás haya escrito un programa o dos. Esta es básicamente la solución de @ steveverrill traducida a Pyth. Sugerencias de mejora son bienvenidas.
Actualización: se agregó 1 byte para que los codigos también comiencen
U
. Tal vez la solución C se basa en un comportamiento indefinido para que funcione ...Creo que esto debería hacerse con menos tareas, pero eso requeriría que modificara mucho el algoritmo. (Bueno, podría intentarlo)
Aquí hay una explicación basada en el código C:
fuente
Y
yZ
.Z
está preinicializado con 0, por lo que guarda los primeros 3 caracteres.n = m
(tercera línea de explicación), que debe significarn = 0
la primera vez, que a su vez requeriríaY
ser 0.Y
se preinicializa con una lista vacía[]
. Y no creo que el valor de lasn
cosas en la primera iteración.U
.JavaScript (ES6) 175
178 204Edite 3 bytes menos, 1 cambiando el código y 2 cambiando la forma en que se cuentan los bytes (sin contar
F=
)El código para evitar repeticiones se toma de @stevemiller. Su forma de administrar los grupos de cartas es aún mejor, pero no voy a robarla.
Bonificación: opcionalmente, puede especificar el número de movimientos.
Menos golf
Prueba
fuente
Javascript - 112
fuente
Java 8,
189183bytesPuerto de la respuesta C de @LevelRiverSt . Intenté algunas cosas yo mismo, pero esto fue más corto de lo que tenía
Pruébalo en línea.
fuente
Ruby ,
11610710595 bytesPruébalo en línea!
fuente
Clojure, 223 bytes
Esto depende en gran medida del patrón "secuencia -> partición por -> filtro -> concat", se utiliza para filtrar secuencias de caras "ilegales". Esta secuencia se asigna a una cadena junto con un postfix aleatorio (incluida la cadena vacía).
Punto de partida sin golf:
fuente