เขาวงกต , 394 386 ไบต์
ฉันภูมิใจแนะนำ ...
<}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111
? @
:" }}_47}_95 3""""""""(
_ : } _ } {=}
2 23_}29_ _ ; : \
0 ; 3 +_( 3_" 60{ .{.{.
"-_95:}}"" 2 0 ) 2 " _ _ {
"" _ : 2 _ ."(; } 3 .{
;_92}_47} : _ 0 = : * ;
: "" 2 {.{{ . -""(
}}:59_}}:::: "";_ . { _ "
} " {.{.{. 32.
}}}_95:}}}}_20-
... เขาวงกต esolang สองมิติใหม่ของฉัน! รหัสข้างต้นไม่ค่อยดีนักกอล์ฟ (มี 161 ช่องและ 25 NOP ดังนั้นเลย์เอาต์ที่ดีกว่านี้อาจทำให้สั้นลงได้มาก) แต่อย่างน้อยฉันก็สามารถแสดงให้เห็นว่าภาษานี้ใช้งานได้สำหรับงานที่ไม่สำคัญ :)
มันทำงานอย่างไร
ก่อนอื่นภาพรวมอย่างรวดเร็วของภาษา:
- เขาวงกตทำงานสองกองหลักและเสริมซึ่งสามารถถือจำนวนเต็มที่ลงนามโดยพลการ ที่ด้านล่างของทั้งสองกองมีศูนย์เป็นจำนวนอนันต์
- คำสั่งคือตัวละครแต่ละตัวในตาราง 2D และพวกเขากลายเป็นเขาวงกต (นั่นคือตัวละครที่ไม่รู้จักโดยเฉพาะช่องว่างเป็นผนัง)
"
เป็น NOP ซึ่งไม่ใช่กำแพงและสามารถเป็นประโยชน์ในการขยายเส้นทางบางอย่างในรหัส เมื่อเทียบกับภาษา 2D อื่น ๆ อีกมากมายขอบจะไม่พันกัน
- ตัวชี้คำสั่ง (IP) เริ่มต้นที่อักขระที่ไม่ใช่ตัวแรก (ตามลำดับการอ่าน) เลื่อนไปทางขวา
@
ยุติโปรแกรม
- หากเป็นไปได้ IP จะตามด้วยทางเดิน (เช่นรอบ ๆ โค้ง) หาก IP มีหลายเซลล์ที่จะย้ายไปโดยทั่วไปแล้วจะเลี้ยวซ้ายถ้าด้านบนสุดของสแต็กหลักเป็นลบให้ย้ายไปข้างหน้าตรงถ้าเป็นศูนย์หรือเลี้ยวขวาถ้าเป็นบวก เมื่อ IP ชนกับกำแพงมันจะกลับทิศทาง (มีรายละเอียดปลีกย่อยอีกเล็กน้อย แต่ไม่ควรสำคัญสำหรับรหัสนี้) นี่เป็นวิธีเดียวที่จะใช้โฟลว์ควบคุม
- นอกเหนือจากคำสั่งการคำนวณทางคณิตศาสตร์และสแต็คสแต็คซอร์สโค้ดสามารถแก้ไขได้ที่รันไทม์พร้อมคำสั่งสี่คำสั่ง
>v<^
ซึ่งจะเลื่อนแถวหรือคอลัมน์ของซอร์สโค้ดโดยวงจรหนึ่งเซลล์ แถวหรือคอลัมน์ใดที่ได้รับผลกระทบขึ้นอยู่กับส่วนบนสุดของสแต็ก หากมีการเลื่อนแถวหรือคอลัมน์ของ IP มันจะย้ายไปพร้อมกับการเปลี่ยนแปลง ทำให้สามารถข้ามจากขอบหนึ่งของซอร์สโค้ดไปยังอีกขอบหนึ่งได้
ตอนนี้สำหรับความท้าทายนี้โดยเฉพาะนี่คือแนวคิดทั่วไปของอัลกอริทึม:
- ดันปลายรถยนต์ขึ้นไปที่หมวก (เช่น
/ \_o oo o
) ลงบนสแต็คเสริม
- อ่านอินพุตและพิจารณาว่าจะผลักดัน
__
หรือ/\
ถัดไป
- ดันส่วนที่เหลือของรถยนต์ (เช่น
__ __ _/ \
และสองช่องว่างนำ) ลงบนสแต็กเสริม
- ยึดอินพุตให้มีค่าสูงสุด
20
เรียกว่าNนี้
- ตอนนี้ทำ 3 ครั้งต่อไปนี้:
- พิมพ์ช่องว่างN
- พิมพ์ 6 ตัวอักษรที่เก็บไว้
- พิมพ์ 60 - 3 * Nช่องว่าง
- พิมพ์ 6 ตัวอักษรที่เก็บไว้
- พิมพ์ newline
สุดท้ายเรามาดูบางส่วนของรหัส IP เริ่มต้นที่มุมซ้ายบนของคำสั่งขยับตาราง ด้านบนของสแต็กหลักคือ0
(ซึ่งใช้เป็นดัชนีที่สัมพันธ์กัน) ดังนั้นแถวแรกจะถูกเลื่อนไปทางซ้ายซึ่งจะย้าย IP ไปทางด้านขวาสุดของตาราง ตอนนี้แถวแรกจะถูกเรียกใช้จากขวาไปซ้ายซึ่งจะผลักชุดอักขระคงที่ชุดแรกไปยังสแต็กเสริม:
}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111<
การเลื่อนแถวนี้มีประโยชน์สำหรับการเล่นกอล์ฟเมื่อคุณต้องการเริ่มต้นด้วยรหัสเชิงเส้นจำนวนมาก
ต่อไปเราอ่านอินพุตและดันหมวกที่ถูกต้อง:
?
:"
_
2
0 ;
"-_95:}}""
"" _
;_92}_47}
บิตทางด้านซ้ายที่มี NOP สามรายการจะส่งผลลัพธ์เชิงลบตามสาขาด้านบนและผลลัพธ์ที่ไม่ใช่เชิงลบตามสาขาด้านล่าง ด้านขวาพวกเขาจะกลับมารวมกัน
ต่อจากนี้ไปยังส่วนที่เป็นเส้นตรงขนาดใหญ่อีกอัน (ซึ่งอาจจะเล่นกอล์ฟได้มากพร้อมกับเคล็ดลับการเปลี่ยนแถวอื่น):
}}_47}_95
: }
23_}29_ _
3
2
:
:
:
}}:59_}}::::
}
}}}_95:}}}}
สิ่งนี้จะผลักดันส่วนที่เหลือของรถยนต์ไปยังสแต็คเสริม
ต่อไปเราคำนวณmin(20, input)
ซึ่งคล้ายกับสาขาแรก:
;
+_(
0 )
2 _
_ 0
"" 2
"";_
"
_20-
ในที่สุดเรามีการวนรอบที่ทำงานสามครั้งเพื่อพิมพ์บรรทัด การวนซ้ำของลูปแต่ละครั้งมีลูปขนาดเล็ก (3x3) สองห่วงเพื่อพิมพ์ช่องว่างรวมทั้งสองส่วนเพื่อพิมพ์อักขระ 6 ตัวจากสแต็กเสริม:
@
3""""""""(
_ } {=}
: \
3_" 60{ .{.{.
2 " _ _ {
."(; } 3 .{
= : * ;
{.{{ . -""(
. { _ "
{.{.{. 32.
เคล็ดลับที่ดีอย่างหนึ่งที่ฉันอยากจะให้ความสนใจคือ.{.{.
ด้านขวา นี่คือจุดจบดังนั้นนอกเหนือจาก.
ตอนท้ายรหัสจะถูกดำเนินการสองครั้งหนึ่งครั้งไปข้างหน้าและย้อนหลังอีกครั้ง นี่เป็นวิธีที่เรียบร้อยในการย่อรหัส palindromic (ตัวจับคือคุณต้องตรวจสอบให้แน่ใจว่า IP ใช้การเลี้ยวที่ถูกต้องเมื่อออกจากทางตันอีกครั้ง)
/ \
เมื่อเทียบกับลง_ _
?