_8
,%
;
"}{{+_5
"= %_!
= """{
;"{" )!
สิ้นสุดด้วยข้อผิดพลาดการหารด้วยศูนย์ (ข้อความแสดงข้อผิดพลาดบน STDERR)
ลองออนไลน์!
เลย์เอาต์รู้สึกไม่มีประสิทธิภาพจริงๆ แต่ตอนนี้ฉันไม่เห็นวิธีในการเล่นกอล์ฟ
คำอธิบาย
การแก้ปัญหานี้จะขึ้นอยู่กับเคล็ดลับเลขคณิตเดนนิส: ใช้ตัวอักษรทั้งหมดรหัส modulo เพิ่มคู่จากปลายทั้งสองข้างและให้แน่ใจว่ามันหารด้วย8
5
ไพรเมอร์เขาวงกต:
- เขาวงกตมีจำนวนเต็มสองจำนวนโดยมีความแม่นยำตามอำเภอใจหลักและaux (iliary) ซึ่งในตอนแรกจะเต็มไปด้วยจำนวนศูนย์ (โดยปริยาย) จำนวนอนันต์
- ซอร์สโค้ดมีลักษณะคล้ายเขาวงกตที่ซึ่งตัวชี้คำแนะนำ (IP) ตามทางเดินเมื่อมันสามารถ (แม้รอบมุม) รหัสเริ่มต้นที่อักขระตัวแรกที่ถูกต้องในลำดับการอ่านคือที่มุมบนซ้ายในกรณีนี้ เมื่อ IP มาถึงรูปแบบของการแยกใด ๆ (เช่นเซลล์ที่อยู่ติดกันหลายแห่งนอกเหนือจากที่มันมาจาก) มันจะเลือกทิศทางตามด้านบนของสแต็กหลัก กฎพื้นฐานคือเลี้ยวซ้ายเมื่อลบเดินหน้าต่อไปเมื่อศูนย์เลี้ยวขวาเมื่อบวก และเมื่อหนึ่งในสิ่งเหล่านี้เป็นไปไม่ได้เพราะมีกำแพงแล้ว IP จะไปในทิศทางตรงกันข้าม IP ยังหันไปรอบ ๆ เมื่อกดปุ่ม Dead Dead
- ตัวเลขจะถูกประมวลผลโดยการคูณด้านบนของสแต็กหลักด้วย 10 จากนั้นเพิ่มตัวเลข
รหัสเริ่มต้นด้วย 2x2 วนตามเข็มนาฬิกาขนาดเล็กซึ่งอ่านโมดูโลอินพุตทั้งหมด 8:
_ Push a 0.
8 Turn into 8.
% Modulo. The last three commands do nothing on the first iteration
and will take the last character code modulo 8 on further iterations.
, Read a character from STDIN or -1 at EOF. At EOF we will leave loop.
ตอนนี้เหลือใช้;
-1
เราเข้าไปอีกวงตามเข็มนาฬิกาซึ่งย้ายด้านบนของสแต็กหลัก (เช่นอักขระสุดท้าย) ลงไปที่ด้านล่าง:
" No-op, does nothing.
} Move top of the stack over to aux. If it was at the bottom of the stack
this will expose a zero underneath and we leave the loop.
= Swap top of main with top of aux. The effect of the last two commands
together is to move the second-to-top stack element from main to aux.
" No-op.
ตอนนี้มีบิตเชิงเส้นสั้น ๆ :
{{ Pull two characters from aux to main, i.e. the first and last (remaining)
characters of the input (mod 8).
+ Add them.
_5 Push 5.
% Modulo.
IP อยู่ที่จุดเชื่อมต่อซึ่งทำหน้าที่เป็นสาขาเพื่อทดสอบการหารด้วย 5 หากผลลัพธ์ของโมดูโลไม่เป็นศูนย์เรารู้ว่าอินพุตไม่ใช่ palindrome ของ Watson-Crick และเราหันไปทางทิศตะวันออก:
_ Push 0.
! Print it. The IP hits a dead end and turns around.
_ Push 0.
% Try to take modulo, but division by zero fails and the program terminates.
มิฉะนั้นเราจะต้องตรวจสอบอินพุตที่เหลืออยู่เรื่อย ๆ ดังนั้น IP จะไปทางทิศใต้ {
ดึงกว่าด้านล่างของการป้อนข้อมูลที่เหลือ หากเราหมดอินพุตแล้วนี่จะเป็น0
(จากด้านล่างของaux ) และ IP ยังคงเคลื่อนที่ต่อไป:
) Increment 0 to 1.
! Print it. The IP hits a dead end and turns around.
) Increment 0 to 1.
{ Pull a zero over from aux, IP keeps moving north.
% Try to take modulo, but division by zero fails and the program terminates.
มิฉะนั้นจะมีการตรวจสอบอักขระจำนวนมากขึ้นในสตริง IP จะหันไปทางทิศตะวันตกและเคลื่อนไปสู่ลูป 2x2 ถัดไป (ตามเข็มนาฬิกา) ซึ่งประกอบด้วยส่วนใหญ่ที่ไม่มี ops:
" No-op.
" No-op.
{ Pull one value over from aux. If it's the bottom of aux, this will be
zero and the IP will leave the loop eastward.
" No-op.
หลังจากวนรอบนี้เราได้รับอินพุตในสแต็กหลักอีกครั้งยกเว้นอักขระตัวแรกและตัวสุดท้ายและมีศูนย์อยู่ด้านบน การ;
ละทิ้ง0
และจากนั้น=
สลับยอดของสแต็ค แต่นี่เป็นเพียงการยกเลิกอันแรก=
ในลูปเพราะตอนนี้เรากำลังเข้าสู่ลูปในตำแหน่งอื่น ล้างและทำซ้ำ