เขาวงกต , 28 25 24 23 22 ไบต์
" >
?!?:|}\{@
@\?"":)!
สนุกมาก! :) นั่นคือโปรแกรมเขาวงกตที่ถูกบีบอัดหนาแน่นที่สุดเท่าที่ฉันเคยเขียนมา ฉันมีหลายเวอร์ชันที่ 20 และ 21 ไบต์ซึ่งเกือบจะใช้ได้ว่าฉันยังสงสัยว่ามันดีที่สุด ...
นี้จะเข้าเป็นรายการของบวกจำนวนเต็ม (ด้วยการคั่นพล) และพิมพ์ผลให้ STDOUT เป็นจำนวนเต็มเลื่อนบรรทัดที่คั่น
กำลังตามล่าสำหรับ 20/21 ไบต์:ฉันได้ตรวจสอบโปรแกรมทั้งหมดของแบบฟอร์มแล้ว
" XX
?!?X}\{@
@\?XX)!
X
ตัวละครที่สมเหตุสมผลอยู่ที่ไหนโดยใช้กำลังดุร้าย แต่ไม่พบวิธีแก้ไขปัญหาที่ถูกต้อง แน่นอนว่านั่นไม่ได้หมายความว่าจะไม่มีทางออกที่สั้นกว่า แต่ก็เป็นไปไม่ได้ที่จะบังคับให้โปรแกรมขนาด 20 ไบต์โดยไม่มีข้อสันนิษฐานในโครงสร้างที่เหมาะสม
คำอธิบาย
(คำอธิบายนั้นล้าสมัยเล็กน้อย แต่ฉันก็ยังไม่มั่นใจว่าวิธีแก้ปัญหานั้นดีที่สุดดังนั้นฉันจะรอการอัปเดตนี้)
ดังนั้นโดยปกติโปรแกรมเขาวงกตควรจะดูเหมือนเขาวงกต ในขณะที่ตัวชี้คำแนะนำอยู่ในทางเดินมันจะทำตามทางเดินนั้น เมื่อ IP ชนกับทางแยกชนิดใดทิศทางจะถูกกำหนดตามค่าสูงสุดของสแต็กหลักของเขาวงกต (เขาวงกตมีสองสแต็คโดยมีเลขศูนย์เป็นศูนย์ที่ด้านล่าง) นั่นหมายความว่าโดยปกติแล้วการวนซ้ำที่ไม่สำคัญจะมีราคาค่อนข้างแพงเพราะถ้าคุณมีเซลล์ที่ไม่ติดผนังทั่วทุกที่ทุกอย่างจะเป็นจุดเชื่อมต่อและในกรณีส่วนใหญ่ด้านบนของสแต็กจะไม่มีค่าที่เหมาะสมสำหรับ IP เพื่อไปตามเส้นทางที่คุณต้องการ ดังนั้นสิ่งที่คุณทำคือคุณขยายลูปให้มากขึ้นโดยที่พวกเขามีทั้งหมดอยู่ตรงกลางโดยมีจุดเข้าและทางออกที่กำหนดไว้เพียงจุดเดียวเท่านั้น
แต่ครั้งนี้ฉันโชคดีจริง ๆ และทุกอย่างลงตัวเข้าด้วยกันอย่างลงตัวฉันสามารถบีบมันทั้งหมดออกเป็นกลุ่มก้อนใหญ่ :)
การควบคุมการไหลเริ่มต้นที่ทาง_
ใต้ การ_
กดศูนย์ลงบนสแต็กหลัก ที่อาจดูเหมือนไม่มี op แต่สิ่งนี้จะเพิ่มความลึกของสแต็ก (ไม่แน่นอน) 1
ที่เราต้องการในภายหลัง
?
อ่านจำนวนเต็มจาก STDIN หากไม่มีจำนวนเต็มที่จะอ่านค่านี้จะส่งค่าศูนย์ ในกรณีดังกล่าว IP จะเคลื่อนที่ไปทางใต้และ@
ยุติโปรแกรมทันที (เนื่องจากรายการอินพุตว่างเปล่า) มิฉะนั้น IP จะเปลี่ยนเป็นตะวันออก
ตอนนี้เรากำลังเข้าสู่วงวนที่แน่นมากด้วยสองจุดออก:
!?;
\?
;
!
พิมพ์จำนวนเต็มกลับไปที่ STDOUT โดยเหลือเพียงศูนย์บนสแต็ก IP เคลื่อนไปทางตะวันออกเรื่อย ๆ และ?
อ่านจำนวนเต็มถัดไป หากนั่นไม่ใช่ศูนย์เราจะเลี้ยวขวาและเคลื่อนไปทางใต้ ?
อ่านอีกอันหนึ่ง (ดัชนีคู่ถัดไป) อีกครั้งถ้านั่นไม่ใช่ศูนย์เราเลี้ยวขวาแล้วเคลื่อนที่ไปทางตะวันตก
จากนั้น\
พิมพ์ตัวป้อนบรรทัดโดยไม่เปลี่ยนสแต็กดังนั้นเราจึงเลี้ยวขวาอีกทิศ !
พิมพ์จำนวนเต็มคู่ดัชนีถัดไป เนื่องจากขณะนี้มีเลขคี่ดัชนีอย่างน้อยหนึ่งค่า (บวก) บนสแต็กเราจะเลี้ยวขวาและวนซ้ำ
เมื่อทั้งสองรายการ?
เข้ามาถึงจุดสิ้นสุดของรายการพวกเขาจะผลักศูนย์และย้ายตรงไปยังรายการที่ตรงกัน;
ซึ่งจะละทิ้งศูนย์นั้น
ในกรณีที่มีเพียงองค์ประกอบเดียวในรายการเราทำเสร็จแล้ว (เพราะเราพิมพ์ออกมาทันที) ดังนั้น IP จะย้ายไปทางตะวันออกเรื่อยไปจนถึง@
สิ้นสุดโปรแกรมอีกครั้ง (พิมพ์ต่อท้าย linefeed ระหว่างทาง)
มิฉะนั้นเราจะต้องพิมพ์จำนวนเต็มคี่ดัชนีเช่นกัน ในกรณีนั้นทั้งสองเส้นทาง (จากจุดทางออกที่สองของลูปแรก) จะรวมกันที่กึ่งกลาง"
โดยเปลี่ยนทิศตะวันออกเป็นกรณีใดกรณีหนึ่ง
_
ดันศูนย์เพื่อหลีกเลี่ยงการทิ้งให้เข้า@
และ;
ทิ้งศูนย์นั้น ตอนนี้เราเข้าสู่วงใหม่:
"}
""
IP เข้าสู่สิ่งนี้บนเซลล์ด้านล่างซ้ายเคลื่อนไปทางเหนือวิ่งวนไปวนมาตามเข็มนาฬิกา }
กะด้านบนของกองหลักไปยังกองเสริม ในขณะที่ยังมีองค์ประกอบอยู่ในสแต็ค แต่ IP ก็ยังคงทำหน้าที่อยู่ เมื่อทุกอย่างเปลี่ยนไปเป็นสแต็คเสริม (และย้อนกลับในกระบวนการ) IP ก็จะเคลื่อนที่ไปทางตะวันออกแทนเข้าสู่วงสุดท้าย:
\{@
#!
\
พิมพ์ linefeed อีกครั้ง{
ย้ายรายการจากสแต็คเสริมกลับไปที่หลัก หากยังคงเป็นรายการของรายการก็จะเป็นบวกและ IP !
เปลี่ยนภาคใต้ที่รายการที่จะพิมพ์ด้วย จากนั้นจึง#
ผลักความลึกของสแต็ก (และตอนนี้นี่เป็นจุดเริ่มต้นที่_
สำคัญเนื่องจากเป็นการ#
รับรองความลึกของสแต็กในเชิงบวก) เพื่อให้ IP ยังคงเลี้ยวขวาผ่าน\
และ{
อีกครั้ง
หลังจากที่เราพิมพ์ทุกอย่างให้{
ดึงศูนย์จากด้านล่างของสแต็คเสริม IP ดำเนินการต่อไปทางตะวันออกและ@
ยกเลิกโปรแกรม