นี่เป็นเรื่องยุ่งยากอย่างน่าประหลาดใจและฉันไม่เชื่อว่ามันจะเป็นสิ่งที่ดีที่สุด ...
<.@!$?
หลังจาก padding และแฉรหัสนี้แสดงถึงกริดฐานสิบหกต่อไปนี้:
สิ่งนี้ใช้โฟลว์การควบคุมที่คล้ายกันเช่นโปรแกรม cat ปราศจากข้อผิดพลาดล่าสุดของฉันเคลื่อนไปตามแนวต้านเส้นทแยงมุม เพื่อให้บรรลุว่าเราเริ่มต้นจากการเบี่ยงเบนตัวชี้คำสั่ง (IP) ไปทางซ้ายซึ่งเส้นทางสีม่วงล้อมรอบไปที่มุมซ้ายล่าง
?
อ่านอินพุตเป็นจำนวนเต็ม !
พิมพ์มันกลับ .
เป็นเพียงไม่มี ตอนนี้มุมของกริดทำหน้าที่เป็นสาขา:
ถ้าใส่เป็น0
ที่ IP @
จะยังคงไปตามเส้นทางสีแดงซึ่งก็ยุติโปรแกรมด้วย
หากอินพุตเป็น1
IP จะดำเนินการต่อบนเส้นทางสีเขียว อีกครั้ง.
เป็นเพียง no-op แต่$
เทียบเท่ากับแทรมโพลีนของ Befunge: มันข้ามคำสั่งต่อไป หลังจากการตัดคำแนะนำต่อไปจะเป็น?
แต่เนื่องจาก$
การดำเนินการจริงยังคงอยู่บนเส้นทางสีฟ้าที่เริ่มต้นด้วยการพิมพ์สำเนาของอีก!
1
วนซ้ำที่มีเฉพาะ!..$
ตอนนี้จะถูกทำซ้ำไปเรื่อย ๆ
การศึกษาการควบคุมการไหลของ Hexagony ...
ฉันเชื่อว่าวิธีการแก้ปัญหาข้างต้นเหมาะสมที่สุด ฉันได้เขียนนักสืบเดรัจฉานซึ่งตรวจสอบโปรแกรม Hexagony 6 ไบต์ทั้งหมดซึ่งมีอย่างน้อยหนึ่งรายการ?!@
(ซึ่งจำเป็นต้องใช้ฉันได้ตรวจสอบ:
และ%
แทนที่@
ด้วยข้อผิดพลาดการหารด้วยศูนย์ แต่ ที่ไม่ได้ช่วยเช่นกัน) เช็คจะพิมพ์โปรแกรมทั้งหมดที่ a) สร้าง a 0
on input 0
และยุติและ b) สร้างอย่างน้อยสอง1
s (และไม่มีอะไรอื่น) และจะไม่ยุติภายใน 60 ticks แรกของโปรแกรม (200 ticks สำหรับ 5-byte solution) . ฉันสงสัยว่าโซลูชันที่ถูกต้องจะใช้เวลามากกว่า 200 เห็บในการพิมพ์ครั้งแรก0
หรือครั้งที่สอง1
บนกริดขนาดเล็กเช่นนั้นอย่างถูกต้องดังนั้นฉันจึงไม่คิดว่าจะพลาดวิธีแก้ไขที่เป็นไปได้
การค้นหาไม่ได้ผลลัพธ์ใด ๆ สำหรับ 5 ไบต์ แต่ 57 ผลลัพธ์สำหรับ 6 ไบต์ (โดยใช้@
ไม่จำเป็นต้องยุติด้วยข้อผิดพลาดหากเราสามารถแก้ปัญหานี้ได้อย่างหมดจดในจำนวนไบต์เดียวกัน) ในบรรดา 57 เพียง 6 ข้อนั้นเป็นผลบวกปลอมซึ่งจริง ๆ แล้วพิมพ์เพียงสอง1
วินาทีแล้วเข้าสู่วงวนไม่สิ้นสุดโดยไม่ต้องพิมพ์อีกต่อไป โซลูชันหนึ่งรายการถูกแสดงสองครั้งเนื่องจากมีสอง!
คำสั่ง นั่นคือโซลูชันที่ถูกต้อง 50 ข้อ
มีความเสื่อมในจำนวนหนึ่งระหว่างวิธีแก้ปัญหาที่อักขระหนึ่งหรือสองตัวไม่มากเช่นเนื่องจากพวกมันไม่มีประสิทธิภาพ การแก้ปัญหาสามารถแบ่งออกเป็น 23 ชุดของโปรแกรมที่แตกต่างกันอย่างแท้จริง (ในบางกรณีมีเพียงความแตกต่างอักขระเดียวระหว่างสองชุด แต่เปลี่ยนการควบคุมการไหลอย่างมีนัยสำคัญดังนั้นฉันจึงนับพวกเขาแยกต่างหาก) กลุ่มสองกลุ่มใช้ประโยชน์จากตัวชี้คำสั่งหลายอย่างในแบบที่ไม่คาดคิด เนื่องจากฉันไม่เคยใช้วิธีเหล่านี้ในการใช้กิ่งไม้และกระจกพวกเขาทำการศึกษาที่น่าสนใจมากในการควบคุมการไหลใน Hexagony และฉันได้เรียนรู้เทคนิคใหม่ ๆ สำหรับสนามกอล์ฟในอนาคต
โดยรวมการควบคุมการไหลเกือบจะเสมอกัน: อ่านจำนวนพิมพ์ ถ้ามัน0
หาทางไป@
, ถ้าไม่วนซ้ำไปเรื่อย ๆ ใน!
ขณะที่กำลังทำให้ค่าขอบเป็น1
ศูนย์ มีข้อยกเว้นเด่นสี่ประการ:
- ทางออกหนึ่ง (หนึ่งกับสอง
!
) พิมพ์สอง1
s ต่อการวนซ้ำผ่านกริดดังนั้นการพิมพ์ประมาณสองครั้งเร็วที่สุดเท่าที่โปรแกรมส่วนใหญ่ ฉันได้ทำเครื่องหมายสิ่งนี้ด้วย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) นี้ได้รับการแก้ไขด้วย)
(เพิ่มขึ้น) เพื่อให้การพิมพ์1
s นอกจากนี้ยังมี 5 รูปแบบที่)
อาจจะเป็น1
หรือo
และ>
อาจเป็น|
:
กลุ่ม 3
อันนี้ดูเกือบจะเหมือนกันกับอันก่อนหน้านี้ แต่มันก็รกเหมือนนรก ขึ้นไปถึงการกดปุ่ม|
แล้วข้ามด้านล่างหรือแถวบนสุดเหมือนกัน แต่ในกรณีของลูป$
ตอนนี้ข้ามไป)
บนกระจก ดังนั้นเราจึงทำตามเส้นทางสีเขียวขุ่นไปทางขวาตอนนี้ตีเพิ่มขึ้นข้ามในช่วง@
ก่อนที่เราจะห่อรอบไป|
อีกครั้งและจากนั้นกลับไปที่เส้นทางสีเขียวที่ด้านบน
กลุ่ม 4
ฉันคิดว่าอันนี้ดีโดยเฉพาะ:
_
กระจกที่มุมบนด้านขวาเป็นครั้งแรกไม่มี-op ดังนั้นเราพิมพ์ด้วยและกด!
เส้นทางตอนนี้ฮิตกระจกแนวนอนและสิ้นสุด เส้นทางใช้เวลาโคจรที่น่าสนใจจริงๆว่า: มัน deflects ลง wraps ไปได้รับการเปลี่ยนเส้นทางไปทางแนวนอนแล้วตัดกลับไปอีกครั้ง จากนั้นจะยังคงเคลื่อนไหวในรูปสี่เหลี่ยมขนมเปียกปูนนี้พิมพ์สองครั้งต่อการทำซ้ำ (ทุกติ๊กที่สาม)<
0
1
!
!
กลุ่ม 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 @
ไป หากอินพุตคือ1
IP จะย้ายไปที่!
, ห่อไปที่ไฟล์ lef-thand <
ที่มันสะท้อน ... ตอนนี้ที่มุม, มันย้อนกลับไปที่!
, ได้รับการเบี่ยงเบนจากด้านขวา<
, สะท้อนจากด้านซ้าย<
และเส้นทางเริ่มต้น เกิน...
ค่อนข้างยุ่ง แต่เป็นระเบียบที่สวยงาม :)
ไดอะแกรมสร้างขึ้นด้วยTimwi ของที่น่าตื่นตาตื่นใจHexagonyColorer