[S S S N
_Push_0][S N
S _Duplicate][S N
S _Duplicate][T N
T S _Read_STDIN_as_character][T T T _Retrieve][S S S T S S T N
_Push_9][T S S T _Subtract][S N
S _Duplicate][N
T S S T N
_If_0_Jump_to_Label_TAB][S S S T N
_Push_1][T S S T _Subtract][S N
S _Duplicate][N
T S S N
_If_0_Jump_to_Label_NEWLINE][S S S T S T T S N
_Push_22][T S S T _Subtract][N
T S T N
_If_0_Jump_to_Label_SPACE][N
S T N
_Jump_to_Label_PRINT][N
S S S T N
_Create_Label_TAB][S S S T S S T S T N
_Push_37][N
S T N
_Jump_to_Label_PRINT][N
S S S N
_Create_Label_NEWLINE][S S S T S S S S T N
_Push_33][N
S T N
_Jump_to_Label_PRINT][N
S S T N
_Create_Label_SPACE][S S S T S S S T T S N
_Push_70][N
S S N
_Create_Label_PRINT][T N
S T _Print_as_integer]
Buchstaben S(Leerzeichen), T(Tabulator) und (Zeilenvorschub) werden Nnur als Hervorhebungen hinzugefügt.
[..._some_action]nur als Erklärung hinzugefügt.
70 Leerzeichen, 37 Tabulatoren und 33 neue Zeilen.
Normalerweise verwende ich die Etiketten erstellen in der Reihenfolge NSSN, NSSSN, NSSTN, NSSSSN, NSSSTN, NSSTSN, NSSTTN, etc. Aber weil eine Reihe Druck , wo die binären S=0/ T=1verwendet wird , um die Anzahl betrifft ich ausgeben müssen, ich die Etiketten NSSN, NSSSN, NSSTN, und NSSSTNstattdessen das gab die Perfekte Anzahl von Leerzeichen / Tabulatoren, die mit den Binärzahlen SSSTSSSSTN(33; Anzahl der Zeilenwechsel), SSSTSSTSTN(37; Anzahl der Tabulatoren) und SSSTSSSTTSN(70; Anzahl der Leerzeichen) gedruckt werden sollen .
Erklärung im Pseudocode:
Character c = STDIN-input as character
If c is a tab:
Print 37
Else if c is a new-line:
Print 33
Else if c is a space:
Print 70
Else
Print 0
Beispiel läuft:
Eingabe: Leerzeichen
Command Explanation Stack Heap STDIN STDOUT STDERR
SSSN Push 0 [0]
SNS Duplicate top (0) [0,0]
SNS Duplicate top (0) [0,0,0]
TNTS Read STDIN as character [0,0] {0:32} \n
TTT Retrieve [0,32] {0:32}
SSSTSSTN Push 9 [0,32,9] {0:32}
TSST Subtract top two (32-9) [0,23] {0:32}
SNS Duplicate top (23) [0,23,23] {0:32}
NTSSTN If 0: Jump to Label_TAB [0,23] {0:32}
SSSTN Push 1 [0,23,1] {0:32}
TSST Subtract top two (23-1) [0,22] {0:32}
SNS Duplicate top (22) [0,22,22] {0:32}
NTSSN If 0: Jump to Label_NEWLINE [0,22] {0:32}
SSSTSTTSN Push 22 [0,22,22] {0:32}
TSST Subtract top two (22-22) [0,0] {0:32}
NTSTN If 0: Jump to Label_SPACE [0] {0:32}
NSSTN Create Label_SPACE [0] {0:32}
SSSTSSSTTSN Push 70 [0,70] {0:32}
NSTN Jump to Label_PRINT [0,70] {0:32}
NSSN Create Label_PRINT [0,70] {0:32}
TNST Print as integer [0] {0:32} 70
error
Programm stoppt mit Fehler: Kein Exit definiert.
Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).
Eingabe: tab
STDIN wird stattdessen \t( 9) sein, in welchem Fall es 0bei der ersten If 0Prüfung sein wird, geht zu LABEL_TAB/ NSSSTNund wird 37stattdessen drücken und drucken .
Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).
Eingabe: Neue Zeile
STDIN wird stattdessen \n( 10) sein, in welchem Fall es 0bei der zweiten If 0Prüfung sein wird, geht zu Label_NEWLINE/ NSSSNund wird 33stattdessen drücken und drucken .
Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).
Eingabe: alles andere
Jedes andere Eingabezeichen NSTN(Sprung zu Label_PRINT) druckt nach der dritten If 0Prüfung 0dasjenige aus, das sich noch auf dem Stapel befand (das wir am Anfang dupliziert haben).
Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).