ความท้าทายนี้ถูกโพสต์เป็นส่วนหนึ่งของความท้าทาย LotMในเดือนเมษายน 2018เช่นเดียวกับวันเกิดปีที่ 2 ของ Brain-flak
ฉันกำลังคิดเกี่ยวกับวิธีที่มีประสิทธิภาพมากที่สุดในการเข้ารหัสโปรแกรมสะกิดสมอง สิ่งที่ชัดเจนที่ต้องทำเนื่องจากมีอักขระที่ใช้ได้เพียง 8 ตัวเท่านั้นคือการจับคู่อักขระแต่ละตัวกับลำดับ 3 บิต นี้มีประสิทธิภาพมาก แต่ก็ยังซ้ำซ้อนมาก มีคุณสมบัติบางอย่างของรหัสสมองสะเก็ดระเบิดที่เราสามารถใช้ประโยชน์จากการเข้ารหัสให้สั้นลงได้
nilads ซึ่งถูกแสดงด้วยวงเล็บ 2 ตัวที่จับคู่กันทำหน้าที่เป็นหน่วยเดียวของข้อมูลมากกว่า 2 ถ้าเราแทนที่แต่ละวงเล็บด้วยอักขระไบต์เดียวสิ่งนี้จะทำให้การเข้ารหัสมีขนาดเล็กลงโดยไม่สูญเสียข้อมูลใด ๆ
อันนี้ไม่ชัดเจน แต่ไบต์การปิดของ monads นั้นซ้ำซ้อนเช่นกัน คิดว่าคุณสามารถเดาได้ว่า
'?'
ตัวละครนั้นเป็นตัวแทนอะไรในตัวอย่างต่อไปนี้{(({}?<>?<>?
หากเราสมมติว่าการป้อนข้อมูลนั้นเป็นรหัสสมองที่ถูกต้องแสดงว่ามีเพียงตัวเลือกเดียวสำหรับเครื่องหมายคำถามแต่ละข้อ ซึ่งหมายความว่าเราสามารถใช้ตัวอักษรmonad อย่างใกล้ชิดเพื่อแทนวงเล็บปิดทุกอัน สิ่งนี้มีประโยชน์เพิ่มเติมในการทำให้ชุดอักขระมีขนาดเล็กซึ่งจะช่วยได้อย่างมากหากเราต้องการใช้การเข้ารหัส huffman เนื่องจากตัวละครmonad closeน่าจะเป็นตัวละครที่พบได้บ่อยที่สุดโดยมีระยะขอบที่กว้างจึงอาจเป็นเพียงบิตเดียวซึ่งมีประสิทธิภาพอย่างมหาศาล
เทคนิคสองอย่างนี้จะให้เราบีบอัดโค้ดที่ทำให้สมองสะบัดผ่านอัลกอริทึมต่อไปนี้:
เปลี่ยนทุกๆวงเล็บปิดของ monad
|
กับ หรือกล่าวอีกนัยหนึ่งให้แทนที่วงเล็บปิดทุกอันที่ไม่ได้นำหน้าด้วยการเปิดการจับคู่ด้วยแถบ ดังนั้น...(({})<(()()())>{})
จะกลายเป็น
(({}|<(()()()||{}|
แทนที่ nilad ทุกตัวด้วยวงเล็บปิด ดังนั้นการจับคู่วงเล็บที่ไม่มีสิ่งใดในนั้นจึงใช้การจับคู่ดังต่อไปนี้:
() --> ) {} --> } [] --> ] <> --> >
ตอนนี้ตัวอย่างสุดท้ายของเรากลายเป็น:
((}|<()))||}|
ลบ
|
อักขระต่อท้าย เพราะเรารู้ว่าจำนวนบาร์ทั้งหมดควรเท่ากับจำนวน({[<
ตัวอักษรทั้งหมดหากมีบาร์ที่ส่วนท้ายหายไปเราสามารถอนุมานได้ ตัวอย่างเช่น:({({})({}[()])})
จะกลายเป็น
({(}|(}[)
ความท้าทายของคุณในวันนี้คือการย้อนกระบวนการนี้
รับสายของสมอง - บีบอัดที่มีเพียงตัวอักษร(){}[]<>|
ขยายเข้าไปในสมองสะเก็ดรหัสต้นฉบับ - คุณสามารถสันนิษฐานได้ว่าสัญญาณที่ป้อนเข้านั้นจะขยายไปยังส่วนที่ถูกต้องของสมอง ซึ่งหมายความว่าไม่มีคำนำหน้าของอินพุตจะมี|
มากกว่า({[<
อักขระ
อินพุตจะไม่มี|
อักขระต่อท้าย สิ่งเหล่านี้จะต้องอนุมานจากบริบท
ตามปกติคุณสามารถส่งทั้งโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบและรูปแบบอินพุต / เอาท์พุตอนุญาต และเนื่องจากนี่คือรหัสกอล์ฟรหัสของคุณจะถูกทำคะแนนตามความยาวของซอร์สโค้ดเป็นไบต์ดังนั้นยิ่งคะแนนยิ่งน้อย
กรณีทดสอบ
นี่คือกรณีทดสอบบางส่วน หากคุณต้องการมากกว่านี้คุณสามารถสร้างกรณีทดสอบของคุณเองด้วยสคริปต์ไพ ธ อนและBrain-Flak Wikiซึ่งเป็นที่มาของกรณีทดสอบส่วนใหญ่มาจาก
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}