นี่เป็นเรื่องยุ่งยากอย่างน่าประหลาดใจและฉันไม่เชื่อว่ามันจะเป็นสิ่งที่ดีที่สุด ...
<.@!$?
หลังจาก padding และแฉรหัสนี้แสดงถึงกริดฐานสิบหกต่อไปนี้:

สิ่งนี้ใช้โฟลว์การควบคุมที่คล้ายกันเช่นโปรแกรม cat ปราศจากข้อผิดพลาดล่าสุดของฉันเคลื่อนไปตามแนวต้านเส้นทแยงมุม เพื่อให้บรรลุว่าเราเริ่มต้นจากการเบี่ยงเบนตัวชี้คำสั่ง (IP) ไปทางซ้ายซึ่งเส้นทางสีม่วงล้อมรอบไปที่มุมซ้ายล่าง
?อ่านอินพุตเป็นจำนวนเต็ม !พิมพ์มันกลับ .เป็นเพียงไม่มี ตอนนี้มุมของกริดทำหน้าที่เป็นสาขา:
ถ้าใส่เป็น0ที่ IP @จะยังคงไปตามเส้นทางสีแดงซึ่งก็ยุติโปรแกรมด้วย
หากอินพุตเป็น1IP จะดำเนินการต่อบนเส้นทางสีเขียว อีกครั้ง.เป็นเพียง no-op แต่$เทียบเท่ากับแทรมโพลีนของ Befunge: มันข้ามคำสั่งต่อไป หลังจากการตัดคำแนะนำต่อไปจะเป็น?แต่เนื่องจาก$การดำเนินการจริงยังคงอยู่บนเส้นทางสีฟ้าที่เริ่มต้นด้วยการพิมพ์สำเนาของอีก! 1วนซ้ำที่มีเฉพาะ!..$ตอนนี้จะถูกทำซ้ำไปเรื่อย ๆ
การศึกษาการควบคุมการไหลของ Hexagony ...
ฉันเชื่อว่าวิธีการแก้ปัญหาข้างต้นเหมาะสมที่สุด ฉันได้เขียนนักสืบเดรัจฉานซึ่งตรวจสอบโปรแกรม Hexagony 6 ไบต์ทั้งหมดซึ่งมีอย่างน้อยหนึ่งรายการ?!@(ซึ่งจำเป็นต้องใช้ฉันได้ตรวจสอบ:และ%แทนที่@ด้วยข้อผิดพลาดการหารด้วยศูนย์ แต่ ที่ไม่ได้ช่วยเช่นกัน) เช็คจะพิมพ์โปรแกรมทั้งหมดที่ a) สร้าง a 0on input 0และยุติและ b) สร้างอย่างน้อยสอง1s (และไม่มีอะไรอื่น) และจะไม่ยุติภายใน 60 ticks แรกของโปรแกรม (200 ticks สำหรับ 5-byte solution) . ฉันสงสัยว่าโซลูชันที่ถูกต้องจะใช้เวลามากกว่า 200 เห็บในการพิมพ์ครั้งแรก0หรือครั้งที่สอง1บนกริดขนาดเล็กเช่นนั้นอย่างถูกต้องดังนั้นฉันจึงไม่คิดว่าจะพลาดวิธีแก้ไขที่เป็นไปได้
การค้นหาไม่ได้ผลลัพธ์ใด ๆ สำหรับ 5 ไบต์ แต่ 57 ผลลัพธ์สำหรับ 6 ไบต์ (โดยใช้@ไม่จำเป็นต้องยุติด้วยข้อผิดพลาดหากเราสามารถแก้ปัญหานี้ได้อย่างหมดจดในจำนวนไบต์เดียวกัน) ในบรรดา 57 เพียง 6 ข้อนั้นเป็นผลบวกปลอมซึ่งจริง ๆ แล้วพิมพ์เพียงสอง1วินาทีแล้วเข้าสู่วงวนไม่สิ้นสุดโดยไม่ต้องพิมพ์อีกต่อไป โซลูชันหนึ่งรายการถูกแสดงสองครั้งเนื่องจากมีสอง!คำสั่ง นั่นคือโซลูชันที่ถูกต้อง 50 ข้อ
มีความเสื่อมในจำนวนหนึ่งระหว่างวิธีแก้ปัญหาที่อักขระหนึ่งหรือสองตัวไม่มากเช่นเนื่องจากพวกมันไม่มีประสิทธิภาพ การแก้ปัญหาสามารถแบ่งออกเป็น 23 ชุดของโปรแกรมที่แตกต่างกันอย่างแท้จริง (ในบางกรณีมีเพียงความแตกต่างอักขระเดียวระหว่างสองชุด แต่เปลี่ยนการควบคุมการไหลอย่างมีนัยสำคัญดังนั้นฉันจึงนับพวกเขาแยกต่างหาก) กลุ่มสองกลุ่มใช้ประโยชน์จากตัวชี้คำสั่งหลายอย่างในแบบที่ไม่คาดคิด เนื่องจากฉันไม่เคยใช้วิธีเหล่านี้ในการใช้กิ่งไม้และกระจกพวกเขาทำการศึกษาที่น่าสนใจมากในการควบคุมการไหลใน Hexagony และฉันได้เรียนรู้เทคนิคใหม่ ๆ สำหรับสนามกอล์ฟในอนาคต
โดยรวมการควบคุมการไหลเกือบจะเสมอกัน: อ่านจำนวนพิมพ์ ถ้ามัน0หาทางไป@, ถ้าไม่วนซ้ำไปเรื่อย ๆ ใน!ขณะที่กำลังทำให้ค่าขอบเป็น1ศูนย์ มีข้อยกเว้นเด่นสี่ประการ:
- ทางออกหนึ่ง (หนึ่งกับสอง
!) พิมพ์สอง1s ต่อการวนซ้ำผ่านกริดดังนั้นการพิมพ์ประมาณสองครั้งเร็วที่สุดเท่าที่โปรแกรมส่วนใหญ่ ฉันได้ทำเครื่องหมายสิ่งนี้ด้วยx2ด้านล่าง
- วิธีแก้ปัญหาเล็กน้อย (ที่มี
o) แทนที่1ด้วย111(รหัสตัวอักษรของo) ดังนั้นพวกเขาจึงพิมพ์สาม 1วินาทีต่อการวนซ้ำทำให้พวกเขาพิมพ์ประมาณสามครั้งเร็วที่สุดเท่าที่โปรแกรมส่วนใหญ่ ฉันได้ทำเครื่องหมายสิ่งเหล่านี้ด้วยx3ด้านล่าง
- สองโซลูชั่นผนวก
1กับค่าขอบในแต่ละซ้ำ (ดังนั้น1-> 11-> 111-> ... ) งานพิมพ์เหล่านั้นเร็วมากแต่ในที่สุดหน่วยความจำจะหมด ฉันได้ทำเครื่องหมายสิ่งเหล่านี้ด้วยOoMด้านล่าง
- โซลูชันสองตัวเข้าสู่วงจรที่แน่นหนาซึ่งเพียงแค่ตีกลับไปมา
!โดยพิมพ์ลงบนเห็บอื่น ๆ (แทนที่จะเป็นทุก ๆ 5 หรือมากกว่านั้น) ซึ่งทำให้พวกมันเร็วขึ้นเล็กน้อย (และ neater) ฉันได้ทำเครื่องหมายสิ่งเหล่านี้ด้วย><ด้านล่าง
ดังนั้นที่นี่เป็นสวนสัตว์ทั้งหมด:
#1 #5 #12 #19
?!/$.@ ?$!>$@ .?!/$@ |!|?$@ # ><
?!/$1@ # OoM ?$!|$@ =?!/$@
?!/$=@ #20
?!/$\@ #6 #13 $@.?<!
?!/$o@ # x3 ?/!<|@ .?/!$@ $@1?<! # OoM
?!/$!@ # x2 =?/!$@ $@=?<!
#7 $@o?<! # x3
#2 ?\!<|@ #14
?!>$)@ \!?__@ #21
?!>$1@ #8 _>_!?@
?!>$o@ # x3 ?<!>$@ # >< #15
?!|$)@ \_?!$@ #22
?!|$1@ #9 <!@.$?
?!|$o@ # x3 ?\$!@$ #16 <!@/$?
\_?!_@ <!@=$?
#3 #10 <$@!$?
?!|)$@ ?~#!@) #17 <.@!$?
?!|1$@ ?~#!@1 $$?\@! </@!$?
?!|o$@ # x3 <=@!$?
#11 #18
#4 ?$)\@! \$?\@! #23
?_!<@> ?$1\@! <<@]!?
?$o\@! # x3
ต่อไปนี้เป็นคำแนะนำสั้น ๆ สำหรับกลุ่มตัวแทนจำนวนหนึ่ง โดยเฉพาะอย่างยิ่งกลุ่มที่ 10 และ 23 คุ้มค่าที่จะเช็คเอาท์ มีเส้นทางอื่นที่น่าสนใจและซับซ้อนบางครั้งในกลุ่มอื่น ๆ แต่ฉันคิดว่าฉันเบื่อคุณมากพอในตอนท้าย สำหรับใครที่อยากจะเรียนรู้จริงๆ Hexagony $เหล่านี้เป็นมั่นเหมาะมูลค่าการตรวจสอบว่าเป็นพวกเขาแสดงการใช้งานที่เป็นไปได้มากยิ่งขึ้นของกระจกและ
กลุ่มที่ 1
อันนี้ไม่ค่อยซับซ้อนกว่าโซลูชันเดิมของฉัน แต่เส้นทางไปในทิศทางที่แตกต่างกัน นอกจากนี้ยังอนุญาตให้มีการเปลี่ยนแปลงจำนวนมากที่สุดในเซลล์เดียวเนื่องจากไม่สามารถแทนที่ op-right ขวาด้วย 5 คำสั่งต่าง ๆ ซึ่งยังคงใช้งานได้โดยไม่ต้องเปลี่ยนโครงสร้าง:

กลุ่ม 2
อันนี้ค่อนข้างน่าสนใจเพราะมันเคลื่อนที่ในแนวนอนเท่านั้น หลังจากตัดไปที่>IP จะกลับด้านทันทีโดยแยกสาขาที่มุม มันไม่ชัดเจนเลยว่าไม่มีแผนภาพ แต่ในกรณีที่1เราสำรวจแถวแรกอีกครั้ง แต่ย้อนหลังในเวลานี้ นอกจากนี้ยังหมายถึงเราพบกัน?อีกครั้งซึ่งตอนนี้ส่งคืน0(EOF) นี้ได้รับการแก้ไขด้วย)(เพิ่มขึ้น) เพื่อให้การพิมพ์1s นอกจากนี้ยังมี 5 รูปแบบที่)อาจจะเป็น1หรือoและ>อาจเป็น|:

กลุ่ม 3
อันนี้ดูเกือบจะเหมือนกันกับอันก่อนหน้านี้ แต่มันก็รกเหมือนนรก ขึ้นไปถึงการกดปุ่ม|แล้วข้ามด้านล่างหรือแถวบนสุดเหมือนกัน แต่ในกรณีของลูป$ตอนนี้ข้ามไป) บนกระจก ดังนั้นเราจึงทำตามเส้นทางสีเขียวขุ่นไปทางขวาตอนนี้ตีเพิ่มขึ้นข้ามในช่วง@ก่อนที่เราจะห่อรอบไป| อีกครั้งและจากนั้นกลับไปที่เส้นทางสีเขียวที่ด้านบน

กลุ่ม 4
ฉันคิดว่าอันนี้ดีโดยเฉพาะ:

_กระจกที่มุมบนด้านขวาเป็นครั้งแรกไม่มี-op ดังนั้นเราพิมพ์ด้วยและกด! เส้นทางตอนนี้ฮิตกระจกแนวนอนและสิ้นสุด เส้นทางใช้เวลาโคจรที่น่าสนใจจริงๆว่า: มัน deflects ลง wraps ไปได้รับการเปลี่ยนเส้นทางไปทางแนวนอนแล้วตัดกลับไปอีกครั้ง จากนั้นจะยังคงเคลื่อนไหวในรูปสี่เหลี่ยมขนมเปียกปูนนี้พิมพ์สองครั้งต่อการทำซ้ำ (ทุกติ๊กที่สาม)<01!!
กลุ่ม 8
นี่เป็นหนึ่งในสองวิธีที่มีการพิมพ์วนอย่างแน่นหนา:

<ทำหน้าที่เป็นสาขา หลังจากห่อสองฮิต0 ในทางกลับกันให้ข้ามไปก่อนจากนั้นส่งไปที่อีกครั้งเพื่อข้ามไป จากนั้น IP จะตัดเข้าไปในเส้นทางสีฟ้าครามซึ่งกระดอนไปมาระหว่างและ(ล้อมรอบขอบระหว่าง)@1?>$@><
กลุ่ม 10
หนึ่งในสองกลุ่มที่ใช้พอยน์เตอร์คำแนะนำอื่น ๆ และมันก็สวยงามมาก Hexagony มี 6 - แต่ละอันเริ่มจากมุมที่แตกต่างกันตามขอบตามเข็มนาฬิกา แต่จะมีเพียงอันเดียวที่เปิดใช้งานในแต่ละครั้ง

?ตามปกติเราอ่านด้วย ตอนนี้~เป็นผลทางลบเอก: มันจะเปลี่ยนเป็น1 ต่อไปเราจะตี-1 #นี่เป็นวิธีหนึ่งในการสลับระหว่าง IP: ใช้ค่าขอบโมดูโล 6 ปัจจุบันและเปลี่ยนเป็น IP ที่สอดคล้องกัน (IP จะถูกกำหนดหมายเลขจาก0ในทิศทางตามเข็มนาฬิกา) ดังนั้นถ้าใส่เป็น0แล้ว IP !@ก็ยังคงเหมือนเดิมและการเดินทางน่าเอือมระอาตรงไปข้างหน้าเข้า แต่ถ้าอินพุตเป็น1ดังนั้นค่าปัจจุบัน-1คือ5 (mod 6)อะไร ดังนั้นเราจึงเปลี่ยนเป็น IP ซึ่งเริ่มต้นในเซลล์เดียวกัน (เส้นทางสีเขียว) ตอนนี้#เป็นแบบไม่มี op และ?ตั้งค่าขอบหน่วยความ0จำเป็น )เพิ่มขึ้นเพื่อให้พิมพ์! 1ตอนนี้เราตี~อีกครั้งเพื่อให้แน่ใจว่า#ยังคงเป็นแบบไม่ใช้งาน (ตรงข้ามกับการสลับเราเป็น IP 1 ซึ่งจะยุติโปรแกรม) มันเป็นความคิดที่แสดงให้เห็นว่าทุกอย่างเข้ากันได้ดีในโปรแกรมเล็ก ๆ นี้
กลุ่ม 22
นี่เป็นกลุ่มที่โซลูชันดั้งเดิมของฉันตั้งอยู่นอกจากนี้ยังเป็นกลุ่มที่ใหญ่ที่สุดเนื่องจากไม่มีการใช้งานในสถานที่ที่แตกต่างกันสองแห่งและมีตัวเลือกมากมายสำหรับคำสั่ง (ไม่มีผลบังคับใช้จริง)
กลุ่ม 23
นี่คือกลุ่มอื่นที่ใช้หลาย IP อันที่จริงอันนี้ใช้3 IP ที่แตกต่างกัน มุมขวาบนนั้นค่อนข้างยุ่งเหยิง แต่ฉันจะพยายามแนะนำคุณผ่านสิ่งนี้:

ดังนั้นจุดเริ่มต้นที่คุณเคยเห็นมาก่อน: <หันเหความสนใจภาคตะวันออกเฉียงเหนือ?อ่านอินพุต ตอนนี้]เป็นอีกวิธีหนึ่งในการเปลี่ยนระหว่าง IP: มันสามารถควบคุม IP ต่อไปตามลำดับทวนเข็มนาฬิกา ดังนั้นเราจึงเปลี่ยนการควบคุมเป็นเส้นทางสีฟ้าครามซึ่ง (ฉันรู้ว่ามันยากที่จะมองเห็น) เริ่มต้นในมุมตะวันออกเฉียงเหนือไปทางตะวันออกเฉียงใต้ มันถูกสะท้อนโดยทันที<เพื่อที่จะล้อมรอบมุมตะวันออกเฉียงใต้ไปทางตะวันตกเฉียงเหนือ นอกจากนี้ยังได้รับความนิยม]ดังนั้นเราจึงเปลี่ยนเป็นIP ถัดไป นี่คือเส้นทางสีเทาที่เริ่มต้นที่มุมตะวันออกไปทางตะวันตกเฉียงใต้ มันพิมพ์อินพุตจากนั้นล้อมรอบมุมตะวันออกเฉียงเหนือ <เบี่ยงเบนเส้นทางไปสู่แนวนอนซึ่งมีการสะท้อนจากอีกด้าน <หนึ่ง ตอนนี้มือขวา<ทำหน้าที่เป็นสาขา: ถ้าใส่เป็น0ที่ IP ย้ายภาคตะวันออกเฉียงเหนือและ wraps @ไป หากอินพุตคือ1IP จะย้ายไปที่!, ห่อไปที่ไฟล์ lef-thand <ที่มันสะท้อน ... ตอนนี้ที่มุม, มันย้อนกลับไปที่!, ได้รับการเบี่ยงเบนจากด้านขวา<, สะท้อนจากด้านซ้าย<และเส้นทางเริ่มต้น เกิน...
ค่อนข้างยุ่ง แต่เป็นระเบียบที่สวยงาม :)
ไดอะแกรมสร้างขึ้นด้วยTimwi ของที่น่าตื่นตาตื่นใจHexagonyColorer