+(+"#(!@
: :
%2_,
ลองออนไลน์! คำตอบนี้เป็นผลมาจากการร่วมมือกับ @ MartinBüttner
คำอธิบาย
ไพรเมอร์ Labyrinth ปกติ (ฉันพูดว่า "ปกติ" แต่ฉันเขียนใหม่นี้ทุกครั้ง):
- Labyrinth เป็นภาษา 2D ตามสแต็กโดยเริ่มต้นจากถ่านตัวแรกที่ถูกต้อง (ที่นี่ด้านซ้ายบน) ที่แต่ละจุดเชื่อมต่อที่มีเส้นทางที่เป็นไปได้ตั้งแต่สองเส้นทางขึ้นไปเพื่อให้ตัวชี้คำแนะนำใช้งานด้านบนของสแต็กจะถูกตรวจสอบเพื่อกำหนดตำแหน่งที่จะไปต่อไป ลบคือเลี้ยวซ้ายศูนย์จะไปข้างหน้าและบวกจะเลี้ยวขวา
- สแต็กไม่มีก้นลึกและเต็มไปด้วยเลขศูนย์ดังนั้นการ popping จากสแต็กที่ว่างเปล่าไม่ใช่ข้อผิดพลาด
- ตัวเลขในรหัสที่มาไม่ได้ผลักดันจำนวนที่สอดคล้องกัน -
n*10 + <digit>แทนพวกเขาปรากฏด้านบนของสแต็คและผลักดัน สิ่งนี้ช่วยให้ง่ายต่อการสร้างจำนวนมาก ในการเริ่มหมายเลขใหม่ให้ใช้_ซึ่งจะเพิ่มจำนวนศูนย์
รหัสนี้ค่อนข้างแปลกตั้งแต่สำหรับการเล่นกอล์ฟวงหลักจะรวมสองงานเข้าด้วยกัน สำหรับครึ่งแรกของรอบแรกนี่คือสิ่งที่เกิดขึ้น:
+(+ Add two zeroes, decrement, add with zero
This leaves -1 on the stack
" NOP at a junction. -1 is negative so we try to turn left, fail, and
turn right instead.
: Duplicate -1
ตอนนี้สแต็กถูกกำหนดค่าเริ่มต้นด้วย -1 ที่ด้านบนการประมวลผลที่แท้จริงสามารถเริ่มต้นได้ นี่คือสิ่งที่วงหลักทำ
, Read a byte of input
_2% Take modulo 2.
:+ Duplicate and add, i.e. double
( Decrement
This maps "(" -> -1, ")" -> 1
+ Add to running total
" NOP at a junction. Go forward if zero, otherwise turn right.
: Duplicate the top of the stack
สำเนาที่ซ้ำกันล่าสุดจะเพิ่มองค์ประกอบลงในสแต็กสำหรับการวนซ้ำทุกครั้งที่เราดำเนินการ สิ่งนี้สำคัญเนื่องจากเมื่อเราตีศูนย์และไปข้างหน้าที่ NOP เราจะ:
# Push stack depth
( Decrement
! Output as num
@ Terminate