Metagolf การคูณ Brainflak


17

คำถามนี้เป็นความท้าทายครั้งแรกของ 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อย่าลืมใส่ลิงค์ไปยังเอาท์พุทของโปรแกรมของคุณสำหรับการตรวจสอบ


1
เพราะเหตุใดการดำเนินงาน 1 และลูปจึงถูกแบน
Neil

@Neil ตัวดำเนินการความสูงของสแต็กถูกแบนเช่นกัน
Erik the Outgolfer

1
@EriktheOutgolfer ฉันได้สั่งห้ามหนึ่งใน metagolf จำนวนเต็มอยู่แล้ว
Neil

7
นักวิทยาศาสตร์คอมพิวเตอร์แปลก ๆ พวกเขาคิดค้นภาษาโปรแกรมที่เป็นไปไม่ได้ที่จะใช้ต่อต้านการเล่นกอล์ฟโดยเนื้อแท้แล้วท้าทายซึ่งกันและกันเพื่อเขียนรหัส golfed เพื่อแก้ปัญหาง่ายๆในภาษานี้ ไม่มีอะไรลึกลับกว่านี้อีกแล้ว +1 ท่านดี
Draco18 ไม่ไว้วางใจ SE

1
@ Qwerp-Derp ฉันดูที่การเพิ่มประสิทธิภาพการส่งออกของโปรแกรม Python ที่เชื่อมโยง (คะแนนปัจจุบัน 681950) และพบว่ามีการประหยัดเพียงเล็กน้อยจากการใช้ 4492 [...]ดังนั้นจึงเป็นการเริ่มต้น
Neil

คำตอบ:


2

ทับทิม, 669856

$answers = Hash.new{|hash,n|
  valid = []
  2.upto(n**0.5){|i|
    valid.push("("+hash[n/i]+")"+"({})"*(i-2)+"{}") if n%i == 0
  }
  valid.push("({})"+hash[n-1])
  (hash[n] = valid.min_by{|s| s.length})
}
$answers[1] = "{}"

def full_answer n
  "("+$answers[n]+")"
end

นี่คือคำตอบพื้นฐานอย่างรวดเร็ว ครั้งแรก 1,000 นาทีโปรแกรมพบที่นี่ (ฉันพยายามโพสต์สิ่งเหล่านี้ทั้งหมด แต่นั่นทำให้ขนาดของ Pastebin สูงสุดมากเกินไป) ฉันอาจเพิ่มคำอธิบายรหัสในภายหลัง

ตัวอย่าง:

360:    ((((((({})(({}){}){})({}){})({}){}){}){}){})
4608:   (((((((((((({})({}){})({}){}){}){}){}){}){}){}){}){}){})
9991:   (({})((({})(((((((({})((({})({}){}){}){}){}){}){}){}){}){}){})({}){}){})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.