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 0personaje 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. vcoloca lo que está en el registro (un cero) en la pila. Será usado como el contador.ges una etiqueta, cuando se alcanza, el control salta a la otra aparición de la letra gen 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.
vcoloca 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. vuna vez más empuja un cero en la pila, *incrementa el registro en uno.
v*v*v
X
v
g
Lo siguiente vcoloca 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, Xno 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 gASCII 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 gque queremos imprimir. vlo 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 Xsaca 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. Xmuestra 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 vcoloca 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, vempuja el valor disminuido a la pila, la IP intenta girar a la derecha y Xsaca 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 Xrama.
#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