Implémenter le Cubically Cube

10

Cubically est un langage ésotérique assez nouveau capable de créer des réponses courtes et de type golf pour un sous-ensemble très spécifique de problèmes. Il est unique en ce qu'il stocke la mémoire sous la forme d'un cube Rubik 3x3, ce qui rend les calculs beaucoup moins triviaux que dans la plupart des langues. Dans Cubically, le programmeur doit faire pivoter le cube interne afin de manipuler les valeurs stockées sur les faces, puis utiliser ces valeurs dans leurs calculs. Les calculs sont effectués sur un seul entier 32 bits stocké sur une face imaginaire connue sous le nom de "bloc-notes". De plus, Cubically peut demander une entrée utilisateur et la stocker dans un tampon d'entrée composé uniquement d'une seule valeur entière.

Le cube

Les faces du cube sont U p, D own, L eft, R ight, F ront et B ack:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

Lorsque le programme démarre, le cube est initialisé de telle sorte que chaque carré de cette face est égal à l'index de base de cette face:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Chaque fois qu'un visage est tourné, il est toujours tourné dans le sens des aiguilles d'une montre:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

La valeur d'une face est définie comme étant la somme de chaque carré de cette face. Par exemple, dans le cube ci-dessus, la valeur de face 0est 3.

Syntaxe

Les commandes sont exécutées en chargeant d'abord une commande en mémoire, puis en lui passant des arguments pour exécuter la commande. Par exemple, la commande F1charge la commande Fen mémoire, puis l'appelle avec l'argument 1. En outre, F13charge la commande Fen mémoire, puis l'appelle avec l'argument 1, puis l'appelle avec l'argument 3. Tout caractère non numérique est traité comme une commande et tout chiffre est traité comme un argument.

Ta tâche

Votre tâche consiste à implémenter le cube de mémoire interne de Cubically dans la langue de votre choix. Votre code devrait pouvoir exécuter un très petit sous-ensemble de la langue.

Commandes

  • R - Faites pivoter la face droite du cube dans le sens horaire le nombre de fois spécifié.
  • L - Faites pivoter la face gauche du cube dans le sens horaire le nombre de fois spécifié.
  • U - Faites pivoter la face supérieure du cube dans le sens horaire le nombre de fois spécifié.
  • D - Faites pivoter la face inférieure du cube dans le sens horaire le nombre de fois spécifié.
  • F - Faites pivoter la face avant du cube dans le sens horaire le nombre de fois spécifié.
  • B - Faites pivoter la face arrière du cube dans le sens horaire le nombre de fois spécifié.
  • %- Affiche la valeur sur la face donnée. La valeur d'une face est définie comme la somme de tous les carrés de cette face.

Règles

  • Vous pouvez utiliser n'importe quelle langue créée avant ou après la date de publication de ce défi pour écrire un programme ou une fonction capable de résoudre ce défi.
  • L'entrée sera transmise via STDIN, sous forme de chaîne ou de tableau de caractères (vous choisissez, veuillez spécifier).
  • La sortie doit être transmise à STDOUT ou en tant que sortie de la fonction, et elle doit être soit un entier, une chaîne contenant uniquement des chiffres, soit un tableau de chiffres. Si votre langue vous oblige à produire une nouvelle ligne de fin, vous pouvez le faire.
  • L'entrée sera toujours dans le format suivant: ([UDLRFB]\d*)*%[0-5]. Il n'y aura aucun espace blanc dans l'entrée.
  • L'entrée pour %utilisera toujours un index basé sur 0.

C'est le , donc la réponse la plus courte en octets l'emporte.

Cas de test

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

Pour plus de cas de test, consultez l'interpréteur TIO . Si TIO ne fonctionne pas, vous pouvez utiliser l'interpréteur Lua à la place.

TehPers
la source
3
Cette question est-elle un double de cela ?
TehPers
En relation.
notjagan
@TehPers Je pense que c'est très similaire. Pour les défis futurs, je recommande de les laisser dans le bac à sable pendant au moins 24 heures, plus longtemps si vous avez encore des questions à ce sujet. (J'ai dû l'apprendre à la dure; mes premiers défis n'ont pas été bien reçus du tout. Ce n'est pas encore clos ou déclassé donc ce n'est pas mal , mais s'il avait été laissé dans le bac à sable plus longtemps, d'autres utilisateurs auraient pu remarqué des défauts que je n'ai pas remarqués.)
MD XF
@MDXF Je garderai cela à l'esprit pour la prochaine fois. Merci!
TehPers
Avez-vous manqué un multiple 4entre Ret Ddans l'exemple RD3F2%5 -> 30?
Jonathan Allan

Réponses:

8

Python 2 , 476 octets

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

Essayez-le en ligne!

Un port de ma réponse Simuler un Rubik's Cube . La nouvelle visite m'a incité à jouer au golf sur 47 octets.

Jonathan Allan
la source
0

Cubiquement , 1 octet

Pas de compétition car c'est boiteux. Ne l'accepte pas.

¶  Read a line from stdin and evaluate

J'ai ajouté cet après-midi: P

MD XF
la source
2
Eh bien, je pense que vous avez le code le plus court.
TehPers
2
@TehPers que je fais, mais comme je l'ai dit, c'est boiteux. Cubically peut gagner d'autres défis rubiks-cube avec ce module intégré, il n'a pas besoin de gagner celui-ci.
MD XF