:?
:
#/)
\ #
!"*@
"
ลองออนไลน์!
สิ่งนี้จะแสดงผลลัพธ์ตามลำดับที่C, B, A
คั่นด้วย linefeeds
คำอธิบาย
ตามปกติไพรเมอร์เขาวงกตสั้น:
- เขาวงกตมีจำนวนเต็มสองจำนวนที่แน่นอนโดยพลการหลักและaux (iliary) ซึ่งเต็มไปด้วยศูนย์ (โดยปริยาย) จำนวนอนันต์ เราจะใช้หลักเท่านั้นสำหรับคำตอบนี้เท่านั้น
- ซอร์สโค้ดมีลักษณะคล้ายเขาวงกตที่ซึ่งตัวชี้คำแนะนำ (IP) ตามทางเดินเมื่อมันสามารถ (แม้รอบมุม) รหัสเริ่มต้นที่อักขระตัวแรกที่ถูกต้องในลำดับการอ่านคือที่มุมบนซ้ายในกรณีนี้ เมื่อ IP มาถึงจุดเชื่อมต่อรูปแบบใด ๆ (เช่นเซลล์ที่อยู่ติดกันหลายแห่งนอกเหนือจากที่มาจาก) มันจะเลือกทิศทางตามด้านบนของสแต็กหลัก กฎพื้นฐานคือเลี้ยวซ้ายเมื่อลบเดินหน้าต่อไปเมื่อศูนย์เลี้ยวขวาเมื่อบวก และเมื่อหนึ่งในสิ่งเหล่านี้เป็นไปไม่ได้เพราะมีกำแพงแล้ว IP จะไปในทิศทางตรงกันข้าม IP ยังหันไปรอบ ๆ เมื่อกดปุ่ม Dead Dead
แม้จะไม่มีสองตัวเลือก ( "
) ที่ทำให้รูปแบบดูเหมือนจะสิ้นเปลืองฉันมีความสุขมากกับวิธีนี้เนื่องจากการควบคุมการไหลของมันค่อนข้างบอบบาง
IP เริ่มต้นที่มุมบนซ้ายของ:
ทางขวา มันจะไปถึงจุดสิ้นสุดทันที?
และหันกลับมาเพื่อให้โปรแกรมเริ่มต้นด้วยโค้ดเชิงเส้นนี้:
: Duplicate top of main stack. This will duplicate one of the implicit zeros
at the bottom. While this may seem like a no-op it actually increases
the stack depth to 1, because the duplicated zero is *explicit*.
? Read n and push it onto main.
: Duplicate.
: Duplicate.
นั่นหมายความว่าเรามีตอนนี้สามสำเนาของn
ในกองหลัก 4
แต่ความลึกของมันคือ สะดวกเพราะมันหมายความว่าเราสามารถสแต็คลึกเพื่อดึงตัวคูณปัจจุบันในขณะที่ทำงานผ่านสำเนาของอินพุต
IP จะเข้าสู่วงวน 3x3 (ตามเข็มนาฬิกา) โปรดทราบว่า#
ซึ่งผลักความลึกของสแต็กจะผลักดันค่าบวกเสมอซึ่งเรารู้ว่า IP จะหันไปทางทิศตะวันออก ณ จุดนี้เสมอ
ร่างกายห่วงคือ:
# Push the stack depth, i.e. the current multiplier k.
/ Compute n / k (rounding down).
) Increment.
# Push the stack depth again (this is still k).
* Multiply. So we've now computed (n/k+1)*k, which is the number
we're looking for. Note that this number is always positive so
we're guaranteed that the IP turns west to continue the loop.
" No-op.
! Print result. If we've still got copies of n left, the top of the
stack is positive, so the IP turns north and does another round.
Otherwise, see below...
\ Print a linefeed.
Then we enter the next loop iteration.
หลังจากวนซ้ำ (สูงสุด!
) สามครั้งสำเนาทั้งหมดn
จะถูกใช้หมดและไม่มีการเปิดเผยศูนย์ที่อยู่ด้านล่าง เนื่องจาก"
ที่ด้านล่าง (ซึ่งเป็นอย่างอื่นดูเหมือนว่าไร้ประโยชน์สวย) ตำแหน่งนี้เป็นทางแยก นั่นหมายความว่าด้วยศูนย์ที่ด้านบนของสแต็ค IP พยายามที่จะไปข้างหน้า (ตะวันตก) แต่เนื่องจากมีกำแพงมันจึงหมุนได้ 180 องศาแล้วเคลื่อนที่กลับไปทางตะวันออกราวกับว่ามันถูกจุดตายแล้ว
ด้วยเหตุนี้บิตต่อไปนี้จึงถูกเรียกใช้งาน:
" No-op.
* Multiply two zeros on top of the stack, i.e. also a no-op.
The top of the stack is now still zero, so the IP keeps moving east.
@ Terminate the program.
C B A
) ถ้ามันระบุไว้อย่างชัดเจนในคำตอบหรือไม่