Tirando los dados
Entonces, estaba tirando dados hace un tiempo y pensé en un desafío.
Dado el cubo con una red tomada de la entrada y una lista de movimientos, encuentre el cuadrado en la parte inferior al final.
Usaré esta imagen para los ejemplos aquí.
Entrada
Usted toma una cadena con una lista de movimientos. La cadena contiene solo las letras mayúsculas ASCII N, S, W y E. Estas corresponden a rodar el cubo un paso en esa dirección.
En la imagen, una N colocaría la cara inferior como 6. En esta imagen, el Norte está lejos de la cámara, el Sur está hacia, el Este está a la derecha y el Oeste está a la izquierda.
También toma una cadena en el siguiente formato: 1P 2P 3P 4P 5P 6P, donde cada P es una posición de N, S, W, E, T y B. T y B son inferiores y superiores.
Los números son la cara con ese número, y la letra representa la posición en la que se encuentra la cara. En caso de que no esté claro, la red siempre estará ordenada por el número, por lo que 1P 2P 3P 4P 5P 6P, nunca 2B 1T 3N 4S 5W 6E.
La posición en la imagen es 1S 2B 3E 4W 5T 6N.
Salida
Su programa debería generar un número que represente el lado inferior.
Casos de prueba
(nothing), 1S 2B 3E 4W 5T 6N -> 2
N, 1S 2B 3E 4W 5T 6N -> 6
NS, 1S 2B 3E 4W 5T 6N -> 2
NWS, 1S 2B 3E 4W 5T 6N -> 2
NWSNWS, 1S 2B 3E 4W 5T 6N -> 2
NWSS, 1S 2B 3E 4W 5T 6N -> 3
NNNNNN, 1S 2B 3E 4W 5T 6N -> 5
SNWEEWS, 1N 2T 3E 4W 5B 6S, 6
SNEEWS, 1N 2T 3W 4S 5B 6E, 4
Otras reglas
También puede suponer que el cubo está en un plano plano infinito, probablemente con algún tipo de fricción.
Lagunas estándar no permitidas, aunque no puedo encontrar ninguna.
Para una entrada no válida, su código puede hacer cualquier cosa excepto iniciar el apocalipsis.
Debido a que este programa debe caber en mis dados, debe ser lo más pequeño posible. Cuento en bytes, con algunas excepciones para idiomas como Carpetas .
(nothing) -> 2
significa que no se proporciona ninguna red, o debería haber una red allí en alguna parte?Respuestas:
CJam,
43403734 bytesGracias a Dennis por ayudarme a ahorrar 6 bytes.
Pruébalo aquí.
Explicación
En cuanto a cómo funciona la asignación de caracteres de instrucción a permutaciones, aquí hay una tabla práctica:
He incluido la
5%
columna porque eso es lo que la indexación cíclica en la cadena hace implícitamente. Para las cuatro permutaciones podemos ver que cada una de ellas deja intactos dos lados (opuestos) y permuta cíclicamente a los otros cuatro.fuente
Ĕ
es276
.6e!
te da una lista de las 720 permutaciones de[0 1 2 3 4 5]
. Y276
resulta ser el índice de[2 1 4 0 3 5]
esa lista.Perl,
166158154144139135134132116 bytesincluye +1 para
-p
Con comentarios:
Fichero de entrada:
Corre con
Salida:
262223564
actualización 158 El uso de
$N, $S, $E, $W
variables globales en lugar de%t = {N=>, S=>, E=>, $W=>}
guardar 8 bytes.actualización 154 Dado que el requisito es que la salida del programa un número, no la impresión de la nueva línea
print "$h{B}\n"
ahorra 4 bytes:print $h{B}
.actualización 144 Ahorre 10 bytes haciendo
en lugar de
actualización 139 Mueva la expresión regular para el comando hasta el final para eliminar una variable, ahorrando 6 bytes.
actualización 135 Guardar 4 bytes en
@l[0..3,0]
lugar de@l[1..3],$l[0]
.actualizar 134 Guardar 1 byte utilizando la asignación
@l=split//,$$_
como valor.actualización 132 Ahorre 2 bytes haciendo en
/^\w+/ && $&
lugar de/^(\w+)/ && $1
.actualización 129 Ahorre 3 bytes usando en
-p
lugar de-n
y asignando $ _ para imprimir.actualización 116 Guardar 13 bytes reescribiendo
split//, /^\w+/ && $&
en/^\w+/g
.fuente
Python 2, 204 bytes
Pensé que era hora de responder a mi propia pregunta.
No muy corto, pero funciona.
Correr como:
Editar : bytes contados incorrectos. Ahora mas largo. :(
fuente