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 0personaggio sulla quarta riga. Il primo pezzo di codice da eseguire è 0;vg. ;prende un numero come input e lo posiziona nello stack. vposiziona 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.
vposiziona uno zero nello stack e lo Xestrae 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. vancora una volta spinge uno zero nello stack, *incrementa il registro di uno.
v*v*v
X
v
g
Il prossimo vposto 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, Xnon 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 gASCII meno la lettera ASCII a. Quindi con una riga di 97 *s incrementiamo il valore nel registro a 103, che corrisponde alla lettera gche vogliamo stampare. vlo 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é Xestrae 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. Xestrae 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 vposiziona 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, vspinge il valore decrementato nello stack, l'IP tenta di girare a destra e Xfa 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 Xramo.
#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