1{?)=}&~".>")!@(</=+={"/>}*
Mở ra:
1 { ? )
= } & ~ "
. > " ) ! @
( < / = + = {
" / > } * .
. . . . .
. . . .
Hãy thử trực tuyến!
Giải trình
Hãy xem xét trình tự b(a) = a(n) - 1
và sắp xếp lại một chút:
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)
Trình tự này rất giống nhau nhưng chúng ta có thể trì hoãn gia số đến cuối, điều này xảy ra để lưu một byte trong chương trình này.
Vì vậy, đây là mã nguồn chú thích:

Được tạo bằng HexagonyColorer của Timwi's .
Và đây là sơ đồ bộ nhớ (hình tam giác màu đỏ hiển thị vị trí và hướng ban đầu của con trỏ bộ nhớ):

Được tạo ra với Timoti's EsotericIDE .
Mã bắt đầu trên đường dẫn màu xám bao bọc góc bên trái, vì vậy bit tuyến tính ban đầu là như sau:
1{?)(
1 Set edge b(1) to 1.
{ Move MP to edge N.
? Read input into edge N.
)( Increment, decrement (no-op).
Sau đó, mã chạm vào <
đó là một nhánh và cho biết bắt đầu (và kết thúc) của vòng lặp chính. Miễn là cạnh N có giá trị dương, đường dẫn màu xanh lá cây sẽ được thực thi. Đường dẫn đó quấn quanh lưới một vài lần, nhưng thực ra nó hoàn toàn tuyến tính:
""~&}=.*}=+={....(
Không .
có ops, vì vậy mã thực tế là:
""~&}=*}=+={(
"" 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.
Khi decrementing điều này làm giảm N
tới 0
, con đường đỏ được thực hiện:
")!@
" Move MP back to edge b(i) (which now holds b(N)).
) Increment to get a(N).
! Print as integer.
@ Terminate the program.