Spirale , punteggio: 61921 5127 4715 4655 4191
4.X~>v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X * X X X X X X X X X X X X X X X X X X X X X X X X X
! > h y t f V b n j u [ ( 1 3 2 ) ] U J N B F T Y H G
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*vvv****v+^v+^v+^v+^*v++4
X X X X X X X X X X X X X X X X X X X X X X X X X X
v v v v v v v v v v v v v v v v v v v v v v v v v v
Y y J F V u t U [ G H B n 3 N 2 j ) h g f ] ( 1 b T
Un interprete può essere trovato qui .
Spiegazione:
P.X~ZZ*v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X X X X X X X X X X X X X X X X X X X X X X X X X X
! h y t f V b n j u r d c m k i e s x l o w a z p q
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*****************************************************************vP
X X X X X X X X X X X X X X X X X X X X X X X X X X
v v v v v v v v v v v v v v v v v v v v v v v v v v
z y x w V u t s r q p o n m l k j i h g f e d c b a
Il programma inizia dal 0
personaggio sulla quarta riga. Il primo pezzo di codice da eseguire è 0;vg
. ;
prende un numero come input e lo posiziona nello stack. v
posiziona ciò che è nel registro (uno zero) nello stack. Sarà usato come contatore. g
è un'etichetta, quando viene raggiunta, il controllo passa all'altra occorrenza della letterag
nel codice.
Quindi qui è dove si trova il controllo:
X
v
g
Poiché c'è spazio bianco in tutte le altre direzioni, il puntatore dell'istruzione inizia a spostarsi verso l'alto.
v
posiziona uno zero nello stack e lo X
estrae immediatamente dallo stack. Poiché il valore visualizzato è zero, il puntatore dell'istruzione si sposta suX
(altrimenti lo tratterebbe come uno spazio).
Per impostazione predefinita, il flusso di controllo è in modalità svolta a destra, quindi ora quando raggiunge la giunzione, il puntatore dell'istruzione gira a destra. v
ancora una volta spinge uno zero nello stack, *
incrementa il registro di uno.
v*v*v
X
v
g
Il prossimo v
posto ciò che è nel registro (numero 1) nello stack, il puntatore dell'istruzione tenta di girare a destra, colpendo il successivo X
. Il valore appena aggiunto allo stack viene estratto e inserito nel registro. Poiché è diverso da zero, X
non viene immesso e l'IP procede invece alla successiva *
a destra, incrementando nuovamente il valore nel registro.
v*v*v*v*v
X X X X X
v v v v v
i h g f e
Questo succede ancora e ancora fino a quando non raggiungiamo la fine di questa parte e *
inizia la linea di s. Ormai il valore nel registro è 6, che è la lettera g
ASCII meno la lettera ASCII a
. Quindi con una riga di 97 *
s incrementiamo il valore nel registro a 103, che corrisponde alla lettera g
che vogliamo stampare. v
lo spinge nello stack, ed P
è un'altra etichetta dopo aver colpito che saltiamo all'altraP
sulla prima riga del codice.
Qui .
estrae il valore dalla pila e lo stampa come personaggio. Dopodiché X
estrae lo zero estraneo dallo stack, quindi ~
confronta i due valori rimanenti nello stack (i valori sono il contatore e il valore di input). Se i valori sono gli stessi, l'operatore inserisce zero nello stack (altrimenti -1 o 1). Ancora una volta, il controllo tenta di girare a destra. X
estrae il valore del confronto dallo stack, se è zero X
, e dopo averlo !
inserito, terminando il programma.
P.X~ZZ*v+^
X
!
Altrimenti l'IP continua con Z
, che è un'etichetta che in questo caso salta solo di un passo verso destra. La ragione di ciò è che il salto riporta a zero il valore nel registro. *
incrementa il registro e v
posiziona 1 risultante nello stack. +
apre i due elementi superiori dello stack (l'1 e il contatore), li aggiunge e posiziona il risultato nello stack (in effetti questo incrementa il contatore di uno). ^
copia il risultato dalla pila al registro senza rimuoverlo dalla pila.
#
decrementa il valore nel registro di uno, v
spinge il valore decrementato nello stack, l'IP tenta di girare a destra e X
fa apparire il valore dallo stack. Se il valore è diverso da zero, l'IP continua a spostarsi verso est, diminuendo il valore nel registro, fino a quando non raggiunge lo zero e l'IP entra in un X
ramo.
#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X X X X X X X X X X X X X X X X X X X X X X X X X
h y t f V b n j u r d c m k i e s x l o w a z p q
Il ramo porta a un'etichetta corrispondente al valore del contatore. Dopo aver colpito l'etichetta, il controllo passa all'altra occorrenza dell'etichetta nella sezione in cui abbiamo iniziato con l'etichetta g
, iniziando un'altra iterazione. Come per il g
, il valore nel registro viene incrementato fino al valore ASCII della lettera che dobbiamo stampare. Quindi il carattere viene stampato e il contatore incrementato, viene selezionata un'altra etichetta. Ciò accade fino a dopo l'ultima iterazione il contatore è uguale all'input e il programma termina.
Modificare:
P.X~Zv+^
X *
! Z
Raggiunge la stessa cosa di
P.X~ZZ*v+^
X
!
ma con meno spazi bianchi.
Modifica 2:
vv****v+^v+^v+^v+^*v++P
Può essere utilizzato al posto di:
*****************************************************************vP