Implementa Cubically Cube


10

Cubically è un linguaggio esoterico abbastanza nuovo in grado di creare brevi risposte da golf per un sottoinsieme molto specifico di problemi. È unico in quanto memorizza la memoria sotto forma di un cubo di Rubik 3x3, rendendo i calcoli molto meno banali rispetto alla maggior parte delle lingue. In Cubically, il programmatore deve ruotare il cubo interno per manipolare i valori memorizzati sulle facce, quindi utilizzare tali valori nei loro calcoli. I calcoli vengono eseguiti su un singolo numero intero a 32 bit memorizzato su una faccia immaginaria nota come "blocco note". Inoltre, Cubically può richiedere l'input dell'utente e memorizzarlo in un buffer di input costituito da un solo valore intero.

Il cubo

Le facce del cubo sono U p, D own, L eft, R ight, F ront e B ack:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

All'avvio del programma, il cubo viene inizializzato in modo tale che ogni quadrato su quella faccia sia uguale all'indice basato su 0 di quella faccia:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Ogni volta che una faccia viene ruotata, viene sempre ruotata in senso orario:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

Il valore di una faccia è definito come la somma di ogni quadrato su quella faccia. Ad esempio, nel cubo sopra, il valore di face 0è 3.

Sintassi

I comandi vengono eseguiti caricando prima un comando in memoria, quindi passandogli gli argomenti per eseguire il comando. Ad esempio, il comando F1caricherà il comando Fin memoria, quindi lo chiamerà con l'argomento 1. Inoltre, F13caricherà il comando Fin memoria, quindi lo chiamerà con l'argomento 1, quindi lo chiamerà con l'argomento 3. Qualsiasi carattere non numerico viene trattato come un comando e qualsiasi cifra viene trattata come un argomento.

Il tuo compito

Il tuo compito è implementare il cubo di memoria interna di Cubically in una lingua a tua scelta. Il tuo codice dovrebbe essere in grado di eseguire un sottoinsieme molto piccolo della lingua.

comandi

  • R - Ruota la faccia destra del cubo in senso orario per il numero di volte specificato.
  • L - Ruota la faccia sinistra del cubo in senso orario per il numero di volte specificato.
  • U - Ruotare la faccia superiore del cubo in senso orario per il numero di volte specificato.
  • D - Ruotare la faccia inferiore del cubo in senso orario per il numero di volte specificato.
  • F - Ruotare la faccia anteriore del cubo in senso orario per il numero di volte specificato.
  • B - Ruotare la faccia posteriore del cubo in senso orario per il numero di volte specificato.
  • %- Emette il valore sulla faccia data. Il valore di una faccia è definito come la somma di tutti i quadrati su quella faccia.

Regole

  • È possibile utilizzare qualsiasi linguaggio creato prima o dopo la data di pubblicazione della sfida per scrivere un programma o una funzione in grado di risolverla.
  • L'input verrà passato tramite STDIN, come stringa o come matrice di caratteri (si sceglie, si prega di specificare).
  • L'output deve essere passato a STDOUT o come output della funzione e deve essere un numero intero, una stringa contenente solo cifre o un array di cifre. Se la tua lingua richiede l' output di una nuova riga finale, puoi farlo.
  • L'ingresso sarà sempre nel formato seguente: ([UDLRFB]\d*)*%[0-5]. Non ci saranno caratteri spazi bianchi nell'input.
  • L'input per %utilizzerà sempre un indice basato su 0.

Questo è , quindi vince la risposta più breve in byte.

Casi test

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

Per altri casi di test, controlla l'interprete TIO . Se TIO non funziona, è possibile utilizzare invece l' interprete Lua .


3
Questa domanda è un duplicato di questo ?
TehPers,


@TehPers Penso che sia molto simile. Per sfide future, ti consiglio di lasciarle nella sandbox per almeno 24 ore, più a lungo se hai ancora domande al riguardo. (Ho dovuto imparare questo nel modo più duro; le mie prime sfide non sono state per niente ben accolte. Non sono ancora chiuse o ridotte al voto, quindi non è male , ma se fossero rimaste nella sandbox più a lungo, altri utenti avrebbero potuto notato difetti che non ho fatto.)
MD XF

@MDXF Lo terrò a mente per la prossima volta. Grazie!
TehPers,

Ti sei perso un multiplo 4tra Re Dnell'esempio RD3F2%5 -> 30?
Jonathan Allan,

Risposte:


8

Python 2 , 476 byte

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

Provalo online!

Una porta dalla mia risposta Simula un cubo di Rubik . La visita mi ha spinto a giocare a golf di 47 byte.


0

Cubicamente , 1 byte

Non competere perché è zoppo. Non accettarlo

¶  Read a line from stdin and evaluate

Ho aggiunto che questo pomeriggio: P


2
Bene, penso che tu abbia il codice più corto.
TehPers

2
@TehPers, ma come ho detto, è zoppo. Cubicamente può vincere altre sfide cubo di rubik con questo built-in, non ha bisogno di vincere questo.
MD XF,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.