Implementar o cubo cubicamente

10

Cubicamente é uma linguagem esotérica relativamente nova, capaz de criar respostas curtas, semelhantes a golfe, para um subconjunto muito específico de problemas. É único, pois armazena memória na forma de um cubo de Rubik 3x3, tornando os cálculos muito menos triviais do que na maioria dos idiomas. Em Cubically, o programador deve girar o cubo interno para manipular os valores armazenados nas faces e, em seguida, usar esses valores em seus cálculos. Os cálculos são realizados em um único inteiro de 32 bits armazenado em uma face imaginária conhecida como "bloco de notas". Além disso, o Cubically pode solicitar entrada do usuário e armazená-lo em um buffer de entrada que consiste em apenas um único valor inteiro.

O cubo

As faces do cubo são L p, D próprio, L EFT, R ight, F ront, e B ack:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

Quando o programa é iniciado, o cubo é inicializado de forma que cada quadrado nessa face seja igual ao índice baseado em 0 da face:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Sempre que um rosto é girado, é sempre girado no sentido horário:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

O valor de uma face é definido como sendo a soma de cada quadrado nessa face. Por exemplo, no cubo acima, o valor da face 0é 3.

Sintaxe

Os comandos são executados primeiro carregando um comando na memória e depois passando argumentos para ele para executar o comando. Por exemplo, o comando F1irá carregar o comando Fna memória, em seguida, chamá-lo com o argumento 1. Além disso, F13carregará o comando Fna memória e depois o 1chamará com o argumento 3. Qualquer caractere que não seja dígito é tratado como um comando e qualquer dígito é tratado como um argumento.

Sua tarefa

Sua tarefa é implementar o cubo de memória interna do Cubically em um idioma de sua escolha. Seu código deve ser capaz de executar um subconjunto muito pequeno do idioma.

Comandos

  • R - Gire a face direita do cubo no sentido horário o número especificado de vezes.
  • L - Gire a face esquerda do cubo no sentido horário o número especificado de vezes.
  • U - Gire a face superior do cubo no sentido horário o número especificado de vezes.
  • D - Gire a face inferior do cubo no sentido horário o número especificado de vezes.
  • F - Gire a face frontal do cubo no sentido horário o número especificado de vezes.
  • B - Gire a face traseira do cubo no sentido horário o número especificado de vezes.
  • %- Mostra o valor na face especificada. O valor de uma face é definido como a soma de todos os quadrados nessa face.

Regras

  • Você pode usar qualquer idioma criado antes ou depois da data em que este desafio foi lançado para escrever um programa ou função capaz de resolvê-lo.
  • A entrada será passada através do STDIN, como uma sequência ou como uma matriz de caracteres (você escolhe, por favor especifique).
  • A saída deve ser passada para STDOUT ou como a saída da função e deve ser um número inteiro, uma sequência contendo apenas dígitos ou uma matriz de dígitos. Se o seu idioma exigir a saída de uma nova linha à direita, você poderá fazê-lo.
  • A entrada será sempre no formato seguinte: ([UDLRFB]\d*)*%[0-5]. Não haverá caracteres de espaço em branco na entrada.
  • A entrada para %sempre usará um índice baseado em 0.

Isso é , então a resposta mais curta em bytes vence.

Casos de teste

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

Para mais casos de teste, consulte o intérprete TIO . Se o TIO não estiver funcionando, você poderá usar o interpretador Lua .

TehPers
fonte
3
Esta questão é uma duplicata de esta ?
TehPers
Relacionado.
notjagan
@TehPers Eu acho que é muito parecido. Para desafios futuros, recomendo deixá-los na caixa de areia por pelo menos 24 horas, mais se você ainda tiver dúvidas. (Eu tive que aprender isso da maneira mais difícil; meus primeiros desafios não foram bem recebidos. Isso ainda não foi fechado ou diminuiu, por isso não é ruim , mas se tivesse sido deixado na sandbox por mais tempo, outros usuários podem ter falhas notado que eu não).
MD XF
@MDXF Vou manter isso em mente na próxima vez. Obrigado!
TehPers 9/08/19
Você perdeu um múltiplo de 4entre Re Dno exemplo RD3F2%5 -> 30?
Jonathan Allan

Respostas:

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])])

Experimente online!

Uma porta da minha resposta Simular um cubo de Rubik . A revisitação me levou a jogar isso em 47 bytes.

Jonathan Allan
fonte
0

Cubicamente , 1 byte

Não competir porque é coxo. Não aceite isso.

¶  Read a line from stdin and evaluate

Eu adicionei que esta tarde: P

MD XF
fonte
2
Bem, acho que você tem o código mais curto.
TehPers
2
@TehPers sim, mas como eu disse, é coxo. Cubicamente pode vencer outros desafios do cubo de rubiks com este built-in, ele não precisa vencer este.
MD XF