[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]
Lettres S(espace), T(tabulation) et N(nouvelle ligne) ajoutées uniquement en surbrillance.
[..._some_action]ajouté comme explication seulement.
70 espaces, 37 tabulations et 33 nouvelles lignes utilisées.
En général , j'utilise le créer des étiquettes dans l'ordre NSSN, NSSSN, NSSTN, NSSSSN, NSSSTN, NSSTSN,NSSTTN , etc. Mais parce que l' impression d' un numéro où le binaire S=0/ T=1est utilisé affecte le nombre que j'ai besoin à la sortie, j'ai utilisé les étiquettes NSSN,NSSSN , NSSTNet au NSSSTNlieu, qui a donné la quantité parfaite d'espaces / onglets à imprimer avec les nombres binaires SSSTSSSSTN(33; quantité de nouvelles lignes), SSSTSSTSTN(37; quantité d'onglets), etSSSTSSSTTSN (70; quantité d'espaces).
Explication en pseudo-code:
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
Exemple fonctionne:
Entrée: espace
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
Le programme s’arrête avec une erreur: Aucune sortie définie.
Essayez-le en ligne (avec des espaces bruts, des onglets et des nouvelles lignes uniquement).
Entrée: onglet
STDIN sera à la place \t( 9), auquel cas ce sera 0lors de la première If 0vérification, passe àLABEL_TAB / NSSSTN, et poussera et imprimera37 place.
Essayez-le en ligne (avec des espaces bruts, des onglets et des nouvelles lignes uniquement).
Entrée: nouvelle ligne
STDIN sera à la place \n( 10), auquel cas ce sera 0à la deuxième If 0vérification, ira à Label_NEWLINE/ NSSSN, et poussera et imprimera33 place.
Essayez-le en ligne (avec des espaces bruts, des onglets et des nouvelles lignes uniquement).
Entrée: autre chose
Tout autre caractère d’entrée suffira NSTN(Passez à Label_PRINT) après le troisième If 0contrôle en imprimant0 qui était encore sur la pile (que nous avons dupliqué au tout début).
Essayez-le en ligne (avec des espaces bruts, des onglets et des nouvelles lignes uniquement).