Implemente el cubo cúbico

10

Cúbicamente es un lenguaje esotérico bastante nuevo capaz de crear respuestas cortas, similares al golf, para un subconjunto muy específico de problemas. Es único en el sentido de que almacena memoria en forma de un cubo de Rubik 3x3, lo que hace que los cálculos sean mucho menos triviales que en la mayoría de los idiomas. En Cubically, el programador debe rotar el cubo interno para manipular los valores almacenados en las caras, luego usar esos valores en sus cálculos. Los cálculos se realizan en un único entero de 32 bits almacenado en una cara imaginaria conocida como "bloc de notas". Además, Cubically puede solicitar la entrada del usuario y almacenarlo en un búfer de entrada que consta de un solo valor entero.

El cubo

Las caras del cubo son U p, D propia, L eft, R ight, F ront, y B ack:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

Cuando se inicia el programa, el cubo se inicializa de modo que cada cuadrado en esa cara sea igual al índice basado en 0 de esa cara:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Cada vez que se gira una cara, siempre se gira en sentido horario:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

El valor de una cara se define como la suma de cada cuadrado en esa cara. Por ejemplo, en el cubo anterior, el valor de la cara 0es 3.

Sintaxis

Los comandos se ejecutan cargando primero un comando en la memoria, luego pasándole argumentos para ejecutar el comando. Por ejemplo, el comando F1cargará el comando Fen la memoria, luego lo llamará con el argumento 1. Además, F13cargará el comando Fen la memoria, luego lo llamará con el argumento 1, luego lo llamará con el argumento3 . Cualquier carácter que no sea un dígito se trata como un comando, y cualquier dígito se trata como un argumento.

Tu tarea

Su tarea es implementar el cubo de memoria interna de Cubically en el idioma que elija. Su código debería poder ejecutar un subconjunto muy pequeño del idioma.

Comandos

  • R - Gire la cara derecha del cubo en el sentido de las agujas del reloj el número especificado de veces.
  • L - Gire la cara izquierda del cubo en el sentido de las agujas del reloj el número especificado de veces.
  • U - Gire la cara superior del cubo en el sentido de las agujas del reloj el número especificado de veces.
  • D - Gire la cara inferior del cubo en el sentido de las agujas del reloj el número especificado de veces.
  • F - Gire la cara frontal del cubo en el sentido de las agujas del reloj el número especificado de veces.
  • B - Gire la cara posterior del cubo en el sentido de las agujas del reloj el número especificado de veces.
  • %- Emite el valor en la cara dada. El valor de una cara se define como la suma de todos los cuadrados en esa cara.

Reglas

  • Puede usar cualquier lenguaje creado antes o después de la fecha en que se publicó este desafío para escribir un programa o función capaz de resolver este desafío.
  • La entrada se pasará a través de STDIN, como una cadena o como una matriz de caracteres (usted elige, especifique).
  • La salida debe pasarse a STDOUT o como salida de la función, y debe ser un número entero, una cadena que contenga solo dígitos o una matriz de dígitos. Si tu idioma te requiere envíe una nueva línea final, puede hacerlo.
  • La entrada será siempre en el formato siguiente: ([UDLRFB]\d*)*%[0-5]. No habrá caracteres de espacio en blanco en la entrada.
  • La entrada para %siempre usará un índice basado en 0.

Este es el , por lo que la respuesta más corta en bytes gana.

Casos de prueba

%0 -> 0
%1 -> 9
%2 -> 18
%3 -> 27
%4 -> 36
%5 -> 45
R1%2 -> 27
RD3F2%5 -> 32
L1R23F1B5U9D2%3 -> 17

Para obtener más casos de prueba, consulte el intérprete de TIO . Si TIO no funciona, puede utilizar el intérprete de Lua .

TehPers
fuente
3
¿Es esta pregunta un duplicado de esto ?
TehPers
Relacionado.
notjagan
@TehPers Creo que es muy similar. Para futuros desafíos, recomiendo dejarlos en la caja de arena durante al menos 24 horas, más tiempo si todavía tiene preguntas al respecto. (Tuve que aprender esto de la manera difícil; mis primeros desafíos no fueron bien recibidos en absoluto. Esto aún no está cerrado ni rechazado, por lo que no está mal , pero si se hubiera dejado en el sandbox por más tiempo, otros usuarios podrían haber noté fallas que no hice.)
MD XF
@MDXF Lo tendré en cuenta para la próxima vez. ¡Gracias!
TehPers
¿Te perdiste un múltiplo de 4entre Ry Den el ejemplo RD3F2%5 -> 30?
Jonathan Allan el

Respuestas:

8

Python 2 , 476 bytes

import re
c=[[i]*9for i in range(6)]
r=lambda f:[f[a+b]for a in(0,1,2)for b in(6,3,0)]
U=lambda c:[r(c[0])]+[c[j+1][:3]+c[j or 4][3:]for j in(1,2,3,0)]+[c[5]]
y=lambda c:[r(c[0])]+c[2:5]+[c[1],r(r(r(c[5])))]
z=lambda c:[c[2],r(r(r(c[1]))),c[5],r(c[3]),c[0][::-1],c[4][::-1]]
s=input()
exec("c="+"(c);c=".join("".join("zzzUz U zzUzz yyyzUzzzy zUzzz yzUzzzyyy".split()[ord(t)%11%7]*sum(map(int,n))for t,n in re.findall("([BUDLFR])(\d*)",s[:-2])))+"(c)")
print sum(c[int(s[-1])])

Pruébalo en línea!

Un puerto de mi respuesta Simulate A Rubik's Cube . La nueva visita me llevó a jugar golf por 47 bytes.

Jonathan Allan
fuente
0

Cúbicamente , 1 byte

No compite porque es cojo. No aceptes esto.

¶  Read a line from stdin and evaluate

Agregué que esta tarde: P

MD XF
fuente
2
Bueno, creo que tienes el código más corto.
TehPers
2
@TehPers lo hago, pero como dije, es lamentable. Cúbicamente puede ganar otros desafíos de cubo de rubik con este incorporado, no necesita ganar este.
MD XF