Ein Stapelzustandsdiagramm zeigt, wie die Werte auf einem Stapel in den anderen geändert werden. Dies ist beispielsweise ein Stapelzustandsdiagramm:
3 0 2 1 0
Dies bedeutet, dass es einen Stapel gibt, der anfänglich 3 Werte enthält (das 3
Teil). Diese Werte werden von 0 bis 2 indiziert, mit 0 an der Spitze: 2 1 0
. Der nächste Teil 0 2 1 0
beschreibt den Endzustand des Stapels: Der Wert, der ursprünglich oben auf dem Stapel lag, wurde ebenfalls nach hinten kopiert.
Diese Transformationen werden auf einem Stapel ausgeführt, der mehrere Datentypen unterstützt:
- Der "Wert" -Typ, der ursprünglich auf dem Stapel gespeichert war. Dies kann eine Zeichenfolge, eine Ganzzahl usw. sein, ihr Wert muss jedoch nicht bekannt sein.
- Der Typ "Liste", bei dem es sich um eine Liste handelt, die Werte eines beliebigen Datentyps enthält.
Um diese Umwandlung zu modellieren, sind die folgenden Operationen zulässig:
S
: Vertauschen Sie die beiden Werte oben auf dem Stapel:2 1 0
→2 0 1
D
: Den Wert oben auf dem Stapel duplizieren:1 0
→1 0 0
R
: Entfernen Sie den obersten Wert vom Stapel.2 1 0
→2 1
L
: Verwandeln Sie den obersten Wert in eine Liste mit einem Element, die diesen Wert enthält:2 1 0
→2 1 (0)
C
: Verketten Sie die beiden obersten Listen auf dem Stapel:2 (1) (0)
→2 (1 0)
U
: Alle Werte aus einer Liste auf den Stapel legen:2 (1 0)
→2 1 0
Diese sind äquivalent zu den Unterlast Befehle ~ : ! a * ^
, vorausgesetzt , dass keine anderen Befehle verwendet werden.
S
, D
, R
, Und L
kann mit irgendwelchen Werten oben auf dem Stapel verwendet werden, aber C
und U
müssen Listen oben auf dem Stapel - Funktion. Eine Übermittlung, deren generierte Sequenzen versuchen, ungültige Operationen durchzuführen (wie D
auf einem leeren Stapel oder U
auf einer Nicht-Liste), ist falsch und muss korrigiert werden .
Um ein Stapelzustandsdiagramm zu lösen, suchen Sie eine Folge von Befehlen, die den anfänglichen Stapelzustand korrekt in den neuen umwandeln. Eine Lösung 3: 0 2 1 0
ist beispielsweise 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
Ihre Aufgabe ist es, ein Programm zu schreiben, das ein Stapelzustandsdiagramm erstellt und eine Lösung ausgibt.
Testfälle
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
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort (in Bytes).
C
Bedarfslisten oben und an der zweiten Position des Stapels? Oder könnte das Element an zweiter Stelle zu einer Liste oben hinzugefügt werden?
C
braucht Listen auf beiden Positionen. Es ist nicht sinnvoll, einen Wert und eine Liste zu verketten.