1{?)=}&~".>")!@(</=+={"/>}*
Déplié:
1 { ? )
= } & ~ "
. > " ) ! @
( < / = + = {
" / > } * .
. . . . .
. . . .
Essayez-le en ligne!
Explication
Examinons la séquence b(a) = a(n) - 1
et faisons un petit réarrangement:
b(a) = a(n) - 1
= a(n-1)*(a(n-1)-1) + 1 - 1
= (b(n-1) + 1)*(b(n-1) + 1 - 1)
= (b(n-1) + 1)*b(n-1)
= b(n-1)^2 + b(n-1)
Cette séquence est très similaire mais nous pouvons reporter l'incrément à la toute fin, ce qui arrive à enregistrer un octet dans ce programme.
Voici donc le code source annoté:
Créé avec HexagonyColorer de Timwi .
Et voici un diagramme de mémoire (le triangle rouge montre la position et l'orientation initiales du pointeur de mémoire):
Créé avec de Timwi EsotericIDE .
Le code commence sur le chemin gris qui enveloppe le coin gauche, donc le bit linéaire initial est le suivant:
1{?)(
1 Set edge b(1) to 1.
{ Move MP to edge N.
? Read input into edge N.
)( Increment, decrement (no-op).
Ensuite, le code frappe le <
qui est une branche et indique le début (et la fin) de la boucle principale. Tant que le bord N a une valeur positive, le chemin vert sera exécuté. Ce chemin fait plusieurs fois le tour de la grille, mais il est en fait entièrement linéaire:
""~&}=.*}=+={....(
Il .
n'y a pas d'opérations, donc le code réel est:
""~&}=*}=+={(
"" Move the MP to edge "copy".
~ Negate. This is to ensure that the value is negative so that &...
& ...copies the left-hand neighbour, i.e. b(i).
}= Move the MP to edge b(i)^2 and turn it around.
* Multiply the two copies of b(i) to compute b(i)^2.
}= Move the MP back to edge b(i) and turn it around.
+ Add the values in edges "copy" and b(i)^2 to compute
b(i) + b(i)^2 = b(i+1).
={ Turn the memory pointer around and move to edge N.
( Decrement.
Une fois cette décrémentation réduite N
à 0
, le chemin rouge est exécuté:
")!@
" Move MP back to edge b(i) (which now holds b(N)).
) Increment to get a(N).
! Print as integer.
@ Terminate the program.