Espiral , puntaje: 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
Se puede encontrar un intérprete aquí .
Explicación:
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
El programa comienza en el 0
personaje en la cuarta línea. El primer fragmento de código que se ejecuta es 0;vg
. ;
toma un número como entrada y lo coloca en la pila. v
coloca lo que está en el registro (un cero) en la pila. Será usado como el contador.g
es una etiqueta, cuando se alcanza, el control salta a la otra aparición de la letra g
en el código.
Entonces aquí es donde está el control ahora:
X
v
g
Como hay espacios en blanco en todas las demás direcciones, el puntero de instrucción comienza a moverse hacia arriba.
v
coloca un cero en la pila yX
saca de la pila inmediatamente. Como el valor emergente es cero, el puntero de instrucción se mueve a X
(de lo contrario, lo trataría como un espacio en blanco).
Por defecto, el flujo de control está en modo de giro a la derecha, por lo que ahora, cuando llega a la unión, el puntero de instrucciones gira a la derecha. v
una vez más empuja un cero en la pila, *
incrementa el registro en uno.
v*v*v
X
v
g
Lo siguiente v
coloca lo que está en el registro (número 1) en la pila, el puntero de instrucción intenta girar a la derecha, presionando el siguiente X
. El valor que se acaba de agregar a la pila aparece y se coloca en el registro. Debido a que no es cero, X
no se ingresa y la IP pasa a la siguiente *
a la derecha, incrementando nuevamente el valor en el registro.
v*v*v*v*v
X X X X X
v v v v v
i h g f e
Esto sucede una y otra vez hasta que lleguemos al final de esta parte y *
comience la línea de s. Por ahora el valor en el registro es 6, que es la letra g
ASCII menos la letra ASCII a
. Por lo tanto, con una línea de 97 *
s incrementamos el valor en el registro a 103, que coincide con la letra g
que queremos imprimir. v
lo empuja a la pila yP
es otra etiqueta al golpear que saltamos a la otraP
en la primera línea del código.
Aquí .
aparece el valor de la pila y lo imprime como un personaje. Después de eso, se X
saca el cero extraño de la pila, luego se ~
comparan los dos valores restantes en la pila (los valores son el contador y el valor de entrada). Si los valores son los mismos, el operador coloca cero en la pila (de lo contrario -1 o 1). Nuevamente, el control intenta girar a la derecha. X
muestra el valor de la comparación de la pila, si es cero X
, y después de !
ingresarlo, finaliza el programa.
P.X~ZZ*v+^
X
!
De lo contrario, la IP continúa hasta el Z
, que es una etiqueta que en este caso salta solo un paso hacia la derecha. La razón para hacerlo es que saltar vuelve a poner el valor en el registro a cero. *
incrementa el registro y v
coloca el 1 resultante en la pila. +
muestra los dos elementos superiores de la pila (el 1 y el contador), los agrega y coloca el resultado en la pila (en efecto, esto incrementa el contador en uno).^
copia el resultado de la pila al registro sin eliminarlo de la pila.
#
disminuye el valor en el registro en uno, v
empuja el valor disminuido a la pila, la IP intenta girar a la derecha y X
saca el valor de la pila. Si el valor no es cero, la IP continúa moviéndose hacia el este, disminuyendo el valor en el registro, hasta que llega a cero, y la IP ingresa a una X
rama.
#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 rama lleva a una etiqueta correspondiente al valor del contador. Al golpear la etiqueta, el control salta a la otra aparición de la etiqueta en la sección donde comenzamos con la etiquetag
, comenzando otra iteración. Al igual que con el g
, el valor en el registro se incrementa hasta el valor ASCII de la letra que necesitamos imprimir. Luego se imprime el carácter y se incrementa el contador, se selecciona otra etiqueta. Esto sucede hasta después de la última iteración, el contador es igual a la entrada y el programa termina.
Editar:
P.X~Zv+^
X *
! Z
Logra lo mismo que
P.X~ZZ*v+^
X
!
pero con menos espacio en blanco.
Edición 2:
vv****v+^v+^v+^v+^*v++P
Se puede usar en lugar de:
*****************************************************************vP