คำถามนี้เป็นความท้าทายครั้งแรกของ Brain-Flak Birthday ที่ออกแบบมาเพื่อฉลองวันเกิดครั้งแรกของ Brain-Flak! คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับวันเกิดของ Brain-Flak ได้ที่นี่
ฤดูร้อนครั้งที่แล้วเรามีBrain-flak Integer Metagolfและคำตอบที่สร้างขึ้นมีประโยชน์มากต่อชุมชน Brain-Flak ตั้งแต่นั้นมา สิ่งสำคัญที่ทำให้ Integer Metagolf มีประสิทธิภาพนั้นเป็นเทคนิคที่เรียกว่าการเข้ารหัสแบบการคูณ
ในการคูณรันไทม์ Brain-Flak มีราคาแพงมาก ตัวอย่างการคูณที่รู้จักกันสั้นที่สุดคือ:
({}<>)({<({}[()])><>({})<>}{}<><{}>)
ค้นพบโดยMegatom
อย่างไรก็ตามมีวิธีง่าย ๆ ในการสร้างการคูณเวลาคอมไพล์ ตัวอย่างเช่นรหัสต่อไปนี้จะคูณด้วย 5:
(({})({})({})({}){})
วิธีนี้ใช้งานได้เนื่องจากนิพจน์ที่ต่อเนื่องกันถูกรวมเข้าด้วยกัน แต่ละคน({})
ไม่ทำอะไรเลยกับสแต็ก ( {}
จะปรากฏขึ้นแล้ว(..)
ดันกลับไปด้านหลัง) และประเมินว่าอะไรก็ตามที่อยู่ด้านบนสุดของสแต็ก นิพจน์เหล่านี้ทั้งหมดรวมกันได้มากถึงห้าเท่าสิ่งที่อยู่ด้านบนสุดของสแต็ก
สำหรับn
นิพจน์สตริงต่อไปนี้จะสร้างตัวอย่างที่จะคูณด้านบนของสแต็กด้วยn
:
"("+"({})"*(n-1)+"{})"
สิ่งนี้ทำงานโดยการn
แสดงออกที่ประเมินทั้งหมดไปด้านบนของสแต็ค อันแรกn-1
ไม่ได้เปลี่ยนแปลงอะไรเลยและอันสุดท้ายจะเอาส่วนบนสุดของสแต็กออกมาก่อนกด
สำหรับหมายเลขคอมโพสิตคุณสามารถโยงนิพจน์ขนาดเล็กหลาย ๆ ตัวเข้าด้วยกันเพื่อบันทึกไบต์ ตัวอย่างเช่นคุณสามารถคูณ 25 ด้วยการคูณด้วย 5 สองครั้ง:
(({})({})({})({}){})(({})({})({})({}){})
มันค่อนข้างง่ายและสำหรับตัวเลขบางตัวก็ใช้งานได้ดี แต่ก็มีวิธีที่ดีกว่าในการทำเช่นนี้ ตัวอย่างเช่นวิธีหนึ่งที่ฉันใช้กับการแทนเลขฐานสองของตัวเลข ( นี่คือการใช้ python ) วิธีการใหม่นี้มีประสิทธิภาพมากกว่าการแสดงออกของสตริงแบบง่าย ๆ ที่แสดงไว้ก่อนหน้านี้ แต่ยังไม่สิ้นสุดมีวิธีการที่น่าสนใจมากมายในการคูณฮาร์โค้ดและอาจเป็นตันที่ยังไม่มีใครค้นพบ
ดังนั้นฉันคิดว่าถึงเวลาที่จะดูว่าเราจะได้รับดีแค่ไหน
ภาพรวมโดยย่อของ Brain-Flak
นี่คือคำอธิบายของทุกสิ่งที่คุณจำเป็นต้องรู้เกี่ยวกับ Brain-Flak สำหรับความท้าทายนี้
Brain-Flak มี "nilads" และ "monads" Nilads เป็นวงเล็บที่ไม่มีอะไรอยู่ข้างใน แต่ละ nilad ทำสิ่งและคืนค่า สำหรับความท้าทายนี้ทั้งสอง nilads ที่เราเป็นห่วงคือ{}
และ<>
. {}
ดึงข้อมูลด้านบนของสแต็กที่ใช้งานอยู่และส่งกลับค่าของมัน <>
สลับสแต็กที่ใช้งานอยู่และในสแต็กที่ใช้งานอยู่เพื่อให้สแต็คที่ใช้งานอยู่ไม่ได้ใช้งานและสแต็คที่ไม่ได้ใช้งานจะกลายเป็นใช้งานก็จะส่งกลับศูนย์
Monads เป็นวงเล็บที่มีสิ่งของอยู่ข้างใน พวกเขาใช้อาร์กิวเมนต์เดียวผลรวมของทุกสิ่งที่อยู่ภายในพวกเขาบางครั้งทำการกระทำแล้วส่งคืนค่า ทั้งสามเหล่านี้เรามีความกังวลกับมี(...)
, และ<...>
[...]
monad ที่สำคัญที่สุดสำหรับความท้าทายนี้(...)
ใช้ค่าของด้านในและผลักดันมันไปยังกองที่ใช้งานอยู่ จากนั้นส่งคืนอาร์กิวเมนต์ <...>
และ[...]
เป็นทั้ง "inert" monads นั่นคือพวกเขาไม่ได้ดำเนินการใด ๆ แต่จะปรับเปลี่ยนค่าที่พวกเขาจะผ่าน <...>
ส่งกลับค่าศูนย์เสมอโดยไม่คำนึงถึงอาร์กิวเมนต์ที่ส่งผ่าน ในขณะเดียวกัน[...]
จะส่งกลับค่าเวลาโต้แย้ง-1
เสมอ
โปรแกรมตัวอย่างพร้อมคำอธิบาย
หากคุณไม่เคยตั้งโปรแกรมใน Brain-Flak มันเป็นความคิดที่ดีที่จะดูตัวอย่างโปรแกรมที่ใช้การดำเนินการที่อธิบายไว้
({}{})
เพิ่มหมายเลขสองอันดับแรกในสแต็ก แต่ละ{}
ค่าจะแยกออกจากสแต็กและ(...)
ผลักดันผลรวมกลับ
({}[{}])
ในทำนองเดียวกันนี้จะลบรายการที่สองในสแต็กจากรายการแรก เช่นเดียวกับก่อนที่แต่ละ{}
ค่าจะปรากฏ แต่ค่า[..]
รอบตัวที่สองทำให้ค่าเพิ่มขึ้น อีกครั้ง(...)
ผลักดันผลรวม
({}<{}>)
สิ่งนี้จะลบค่าที่สองบนสแต็กซึ่งรักษาค่าสูงสุดไว้เหมือนเดิม มันทำงานได้เหมือนสองคนสุดท้ายยกเว้นค่าที่สองถูกทำให้เงียบโดย<...>
การกดจะส่งค่าแรกกลับเท่านั้น
(({}))
สิ่งนี้ทำให้สำเนาที่สองของค่าอยู่ด้านบนสุดของสแต็ก มันทำเช่นนี้โดยการ popping ที่ด้านบนของสแต็กด้วย{}
การรับค่าของมันก่อน(..)
แล้วผลักมันกลับไปประเมินค่าของมัน ที่สอง(...)
นำค่าที่ส่งคืนโดยอันที่หนึ่งและผลักไปที่สแต็กเช่นกัน สร้างสำเนาที่สอง
งาน
ได้รับจำนวนเต็มn
สร้างชุดทำความสะอาด Brain-Flak snippet n
คูณว่าด้านบนของสแต็คในปัจจุบันโดย
คุณได้รับอนุญาตให้ใช้การทำงานของ Brain-Flak ต่อไปนี้
(...) -> Push Monad, Pushes the result of its contents
<...> -> Zero Monad, Returns zero
[...] -> Negative Monad, Returns the opposite of its contents result
{} -> Pop nilad, Pops the TOS and returns its value
<> -> Switch nilad, Switches the active and inactive stack
การดำเนินการอื่น ๆ ถูกแบนเพื่อความท้าทาย
เกณฑ์การให้คะแนน
คะแนนของคุณจะเป็นความยาวที่มีการสะสมของโปรแกรมทั้งหมดที่ได้จากการn=2
n=10000
อย่าลืมใส่ลิงค์ไปยังเอาท์พุทของโปรแกรมของคุณสำหรับการตรวจสอบ
[...]
ดังนั้นจึงเป็นการเริ่มต้น