Espiral , pontuação: 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
Um intérprete pode ser encontrado aqui .
Explicação:
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
O programa começa no 0
personagem na quarta linha. O primeiro pedaço de código a ser executado é 0;vg
. ;
pega um número como entrada e o coloca na pilha. v
coloca o que está no registrador (um zero) na pilha. Será usado como contador. g
é um rótulo, quando é atingido, o controle salta para a outra ocorrência da letra g
no código.
Então é aqui que o controle está agora:
X
v
g
Como existe espaço em branco em todas as outras direções, o ponteiro da instrução começa a se mover para cima.
v
coloca um zero na pilha e X
a lança imediatamente. Como o valor exibido é zero, o ponteiro da instrução se move paraX
(caso contrário, ele seria tratado como espaço em branco).
Por padrão, o fluxo de controle está no modo virar à direita; agora, quando atinge a junção, o ponteiro da instrução gira para a direita. v
mais uma vez, empurra um zero para a pilha, *
incrementa o registro em um.
v*v*v
X
v
g
O próximo v
coloca o que está no registrador (número 1) na pilha, o ponteiro da instrução tenta girar para a direita, pressionando o próximo X
. O valor adicionado à pilha é exibido e colocado no registro. Como ele é diferente de zero, X
não é inserido e o IP prossegue para o próximo *
à direita, aumentando novamente o valor no registro.
v*v*v*v*v
X X X X X
v v v v v
i h g f e
Isso acontece repetidamente até chegarmos ao final desta parte e a linha de *
s começa. Até agora, o valor no registro é 6, que é a letra g
ASCII menos a letra ASCII a
. Assim, com uma linha de 97 *
s, aumentamos o valor no registro para 103, que corresponde à letra g
que queremos imprimir. v
empurra-o para a pilha e P
é outro rótulo ao bater, que pulamos para o outroP
na primeira linha do código.
Aqui .
aparece o valor da pilha e o imprime como um caractere. Depois disso, X
aparece o zero estranho da pilha e ~
compara os dois valores restantes na pilha (os valores sendo o contador e o valor de entrada). Se os valores forem iguais, o operador coloca zero na pilha (caso contrário, -1 ou 1). Novamente, o controle tenta virar à direita. X
exibe o valor da comparação da pilha, se for zero X
, e depois de !
inserida, finalizando o programa.
P.X~ZZ*v+^
X
!
Caso contrário, o IP continuará no Z
, que é um rótulo que, neste caso, salta apenas um passo para a direita. A razão para fazer isso é que pular define o valor no registro de volta a zero. *
incrementa o registro e v
coloca o 1 resultante na pilha. +
exibe os dois elementos principais da pilha (o 1 e o contador), os adiciona e coloca o resultado na pilha (na verdade, isso incrementa o contador em um). ^
copia o resultado da pilha para o registro sem removê-lo da pilha.
#
diminui o valor no registro em um, v
empurra o valor diminuído para a pilha, o IP tenta virar para a direita e X
exibe o valor da pilha. Se o valor for diferente de zero, o IP continuará se movendo para o leste, diminuindo o valor no registro, até atingir zero, e o IP entrar em uma X
ramificação.
#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
A ramificação leva a um rótulo correspondente ao valor do contador. Ao atingir o rótulo, o controle salta para a outra ocorrência do rótulo na seção em que começamos com o rótulog
, iniciando outra iteração. Assim como em g
, o valor no registro é incrementado até o valor ASCII da letra que precisamos imprimir. Em seguida, o caractere é impresso e o contador incrementado, outra etiqueta é selecionada. Isso acontece até depois da última iteração, o contador é igual à entrada e o programa termina.
Editar:
P.X~Zv+^
X *
! Z
Consegue a mesma coisa que
P.X~ZZ*v+^
X
!
mas com menos espaço em branco.
Edição 2:
vv****v+^v+^v+^v+^*v++P
Pode ser usado em vez de:
*****************************************************************vP