Spirale , score: 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 interprète peut être trouvé ici .
Explication:
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
Le programme commence au 0
caractère sur la quatrième ligne. Le premier morceau de code à exécuter est 0;vg
.;
prend un nombre en entrée et le place dans la pile. v
place ce qui est dans le registre (un zéro) dans la pile. Il sera utilisé comme compteur. g
est une étiquette, lorsqu'elle est atteinte, le contrôle passe à l'autre occurrence de la lettre g
dans le code.
C'est donc là que se trouve le contrôle:
X
v
g
Puisqu'il y a un espace dans toutes les autres directions, le pointeur d'instruction commence à se déplacer vers le haut.
v
place un zéro dans la pile et le X
sort immédiatement de la pile. Étant donné que la valeur sautée est zéro, le pointeur d'instruction se déplace vers X
(sinon il le traiterait comme un espace).
Par défaut, le flux de contrôle est en mode tourner à droite, donc maintenant quand il atteint la jonction, le pointeur d'instruction tourne vers la droite. v
pousse encore une fois un zéro dans la pile, *
incrémente le registre de un.
v*v*v
X
v
g
La prochaine v
place ce qui est dans le registre (numéro 1) dans la pile, le pointeur d'instruction tente de tourner vers la droite, frappant la suivante X
. La valeur qui vient d'être ajoutée à la pile est extraite et placée dans le registre. Parce qu'il est différent de zéro, X
n'est pas entré et l'IP passe à la suivante *
à droite à la place, incrémentant à nouveau la valeur dans le registre.
v*v*v*v*v
X X X X X
v v v v v
i h g f e
Cela se produit encore et encore jusqu'à ce que nous atteignions la fin de cette partie et que la ligne de *
s commence. À présent, la valeur dans le registre est 6, qui est la lettre g
ASCII moins la lettre ASCII a
. Ainsi, avec une ligne de 97 *
s, nous incrémentons la valeur du registre à 103, ce qui correspond à la lettre que g
nous voulons imprimer. v
le pousse dans la pile, et P
est une autre étiquette lors de la frappe que nous sautons à l'autre P
sur la première ligne du code.
Ici .
apparaît la valeur de la pile et l'imprime comme un caractère. Après cela, X
le zéro étranger de la pile apparaît, puis ~
compare les deux valeurs restantes de la pile (les valeurs étant le compteur et la valeur d'entrée). Si les valeurs sont les mêmes, l'opérateur place zéro dans la pile (sinon -1 ou 1). Encore une fois, le contrôle tente de tourner à droite. X
extrait la valeur de la comparaison de la pile, si elle est nulle X
, et après sa !
saisie, termine le programme.
P.X~ZZ*v+^
X
!
Sinon, l'IP continue vers le Z
, qui est une étiquette qui dans ce cas ne saute qu'une étape vers la droite. La raison en est que le saut remet la valeur du registre à zéro. *
incrémente le registre et v
place le résultat 1 dans la pile.+
fait apparaître les deux éléments supérieurs de la pile (le 1 et le compteur), les ajoute et place le résultat dans la pile (en fait, cela incrémente le compteur d'une unité). ^
copie le résultat de la pile dans le registre sans le retirer de la pile.
#
décrémente la valeur dans le registre d'une v
unité , pousse la valeur décrémentée vers la pile, l'IP tente de tourner vers la droite et fait X
sortir la valeur de la pile. Si la valeur est non nulle, l'IP continue de se déplacer vers l'est, décrémentant la valeur dans le registre, jusqu'à ce qu'elle atteigne zéro et que l'IP entre dans une X
branche.
#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
La branche conduit à une étiquette correspondant à la valeur du compteur. En frappant l'étiquette, le contrôle passe à l'autre occurrence de l'étiquette dans la section où nous avons commencé avec l'étiquette g
, en commençant une autre itération. Comme pour le g
, la valeur dans le registre est incrémentée jusqu'à la valeur ASCII de la lettre que nous devons imprimer. Ensuite, le caractère est imprimé et le compteur incrémenté, une autre étiquette est sélectionnée. Cela se produit jusqu'à ce qu'après la dernière itération, le compteur soit égal à l'entrée et le programme se termine.
Modifier:
P.X~Zv+^
X *
! Z
Atteint la même chose que
P.X~ZZ*v+^
X
!
mais avec moins d'espace.
Modifier 2:
vv****v+^v+^v+^v+^*v++P
Peut être utilisé à la place de:
*****************************************************************vP