Un diagramma dello stato dello stack mostra come i valori di uno stack vengono modificati nell'altro. Ad esempio, questo è un diagramma dello stato dello stack:
3 0 2 1 0
Ciò significa che esiste inizialmente uno stack contenente 3 valori (la 3
parte). Questi valori sono indicizzati da 0 a 2, con 0 in alto: 2 1 0
. La parte successiva 0 2 1 0
descrive lo stato finale dello stack: anche il valore originariamente in cima allo stack è stato copiato sul retro.
Queste trasformazioni avvengono su uno stack che supporta diversi tipi di dati:
- Il tipo "valore", che è ciò che è originariamente nello stack. Potrebbe essere una stringa, un numero intero, ecc. Ma non è necessario conoscerne il valore.
- Il tipo "elenco", che è un elenco contenente valori di qualsiasi tipo di dati.
Per modellare questa trasformazione, sono consentite le seguenti operazioni:
S
: Scambia i due valori in cima alla pila:2 1 0
→2 0 1
D
: Duplica il valore in cima allo stack:1 0
→1 0 0
R
: Rimuove il valore più alto dallo stack.2 1 0
→2 1
L
: Trasforma il valore più alto in un elenco di un elemento contenente quel valore:2 1 0
→2 1 (0)
C
: Concatena le prime due liste in pila:2 (1) (0)
→2 (1 0)
U
: Posiziona tutti i valori di un elenco nello stack:2 (1 0)
→2 1 0
Questi sono equivalenti ai comandi Underload~ : ! a * ^
, a condizione che non vengano utilizzati altri comandi.
S
, D
, R
, E L
può essere utilizzato con qualsiasi valore in cima alla pila, ma C
e U
deve avere liste in cima alla pila di funzionare. Un invio le cui sequenze generate tentano di eseguire operazioni non valide (come D
su uno stack vuoto o U
su un non elenco) è errato e deve essere sanzionato .
Per risolvere un diagramma dello stato dello stack, trova una sequenza di comandi che trasformerà correttamente lo stato dello stack iniziale in quello nuovo. Ad esempio, una soluzione 3: 0 2 1 0
è LSLCSLCULSLCLSLDCSC USLCU
:
2 1 0
L 2 1 (0)
S 2 (0) 1
L 2 (0) (1)
C 2 (0 1)
S (0 1) 2
L (0 1) (2)
C (0 1 2)
U 0 1 2
L 0 1 (2)
S 0 (2) 1
L 0 (2) (1)
C 0 (2 1)
L 0 ((2 1))
S ((2 1)) 0
L ((2 1)) (0)
D ((2 1)) (0) (0)
C ((2 1)) (0 0)
S (0 0) ((2 1))
C (0 0 (2 1))
U 0 0 (2 1)
S 0 (2 1) 0
L 0 (2 1) (0)
C 0 (2 1 0)
U 0 2 1 0
Il tuo compito è quello di scrivere un programma che prende un diagramma di stato dello stack e genera una soluzione.
Casi test
2 1 0 ->
3 2 0 -> SR
9 -> RRRRRRRRR
2 0 1 0 -> LSLCDCUR
2 0 1 1 -> SD
6 2 -> RRSRSRSR
5 0 1 2 3 4 -> LSLCSLCSLCSLCU
4 2 0 1 3 2 -> LSLCSLSCSLCULSLSCSLSCLSLDCSCUSLCU
Questo è code-golf , quindi vince la risposta valida più breve (in byte).
C
elenchi di necessità nella prima e nella seconda posizione dello stack? o l'elemento in seconda posizione potrebbe essere aggiunto a un elenco in alto?
C
elenchi di necessità in entrambe le posizioni. Non ha senso concatenare un valore e un elenco.