1{?)=}&~".>")!@(</=+={"/>}*
กางออก:
1 { ? )
= } & ~ "
. > " ) ! @
( < / = + = {
" / > } * .
. . . . .
. . . .
ลองออนไลน์!
คำอธิบาย
ลองพิจารณาลำดับb(a) = a(n) - 1
และทำการเรียงใหม่เล็กน้อย:
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)
ลำดับนี้คล้ายกันมาก แต่เราสามารถเลื่อนการเพิ่มขึ้นไปจนสุดซึ่งเกิดขึ้นเพื่อบันทึกไบต์ในโปรแกรมนี้
ดังนั้นนี่คือซอร์สโค้ดที่มีคำอธิบายประกอบ:
ที่สร้างขึ้นด้วย Timwi ของHexagonyColorer
และนี่คือแผนภาพหน่วยความจำ (สามเหลี่ยมสีแดงแสดงตำแหน่งเริ่มต้นและทิศทางของตัวชี้หน่วยความจำ):
ที่สร้างขึ้นด้วย Timwi ของEsotericIDE
รหัสเริ่มต้นบนเส้นทางสีเทาซึ่งล้อมรอบมุมซ้ายดังนั้นบิตเชิงเส้นเริ่มต้นมีดังต่อไปนี้:
1{?)(
1 Set edge b(1) to 1.
{ Move MP to edge N.
? Read input into edge N.
)( Increment, decrement (no-op).
จากนั้นรหัสจะกระทบ<
ซึ่งเป็นสาขาและระบุจุดเริ่มต้น (และสิ้นสุด) ของลูปหลัก ตราบใดที่ขอบNมีค่าเป็นบวกเส้นทางสีเขียวจะถูกดำเนินการ เส้นทางนั้นล้อมรอบกริดสองสามครั้ง แต่จริง ๆ แล้วเป็นเส้นตรง:
""~&}=.*}=+={....(
The .
no-ops ดังนั้นรหัสจริงคือ:
""~&}=*}=+={(
"" 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.
เมื่อ decrementing นี้จะช่วยลดN
การ0
เส้นทางสีแดงจะถูกดำเนินการ:
")!@
" Move MP back to edge b(i) (which now holds b(N)).
) Increment to get a(N).
! Print as integer.
@ Terminate the program.