เคล็ดลับสำหรับการเล่นกอล์ฟใน Brachylog


19

Brachylogเป็นภาษาที่เริ่มมีชื่อเสียงมากขึ้นในการเขียนโค้ดกอล์ฟ (และเพิ่งได้รับการอัปเดตครั้งใหญ่พร้อมกับไวยากรณ์ของผู้ใช้ซ้ำ) เช่นเดียวกับ Prolog มันมีข้อดีที่มักจะสามารถแก้ปัญหาได้ (โดยทั่วไปผ่านการใช้กำลังดุร้าย) จากคำอธิบายที่ถูกต้องอย่างพอเพียงว่าลักษณะของปัญหานั้นเป็นคุณลักษณะที่หมายความว่าในการท้าทายที่ถูกต้อง ภาษากอล์ฟชั้นนำ (และเป็นที่รู้จักกันว่าเอาชนะเจลลี่เป็นครั้งคราว)

คุณมีเคล็ดลับอะไรสำหรับการเล่นกอล์ฟ (เช่นการเขียนโปรแกรมที่สั้นที่สุดที่เป็นไปได้) Brachylog นี่คือการมองหาคำแนะนำที่เฉพาะเจาะจงกับ Brachylog โดยเฉพาะมากกว่าคำแนะนำที่ใช้กับภาษาที่หลากหลาย (เคล็ดลับเกี่ยวกับการเล่นกอล์ฟในภาษาที่ประกาศโดยทั่วไปอาจมีความเหมาะสมที่นี่ขึ้นอยู่กับจำนวนแอปพลิเคชันที่พวกเขาจะต้องใช้กับภาษาอื่นที่นอกเหนือจาก Brachylog แม้ว่าจะดูเคล็ดลับสำหรับการเล่นกอล์ฟใน Prologด้วย)

คำตอบ:


4

ใช้ประโยชน์จากเพรดิเคตที่ซ้อนกันเพื่อสร้างตัวแปรใหม่

Brachylog มีกรณีไวยากรณ์พิเศษมากมายที่ทำให้ตัวแปรพิเศษสองตัว?(พารามิเตอร์อินพุต / ซ้าย) และ.(พารามิเตอร์เอาท์พุท / ขวา), terser ที่จะใช้ ซึ่งหมายความว่าถ้าคุณไม่จำเป็นต้องเข้าถึงกริยาของคุณ?และ.แต่ไม่จำเป็นที่จะต้องใช้ตัวแปรที่คุณมักจะสามารถประหยัดไบต์ผ่านการสร้างกริยาซ้อนกันที่จะใช้มัน และ?.

ตัวอย่างง่ายๆให้พิจารณาโปรแกรมที่มีลักษณะดังนี้:

… A … ∧A … B … B …

นี่เป็นรูปร่างที่ค่อนข้างธรรมดาสำหรับโปรแกรมที่ยาวกว่า ท้ายที่สุดมีช่องว่างมากมายที่อาจมีอะไรอยู่ สมมติว่าเราไม่มีความต้องการ?หรือ.อยู่ตรงกลางช่องว่างสามช่อง จากนั้นเราสามารถเขียนซ้ำได้ดังนี้:

… { … & … . … } …

นี่กริยาซ้อนกันของ?จะทำหน้าที่บทบาทของAตนและจะทำหน้าที่บทบาทของ. Bเราสามารถสังเกตได้ว่านี่เป็นไบต์ที่สั้นกว่าโค้ดต้นฉบับ การเปลี่ยนAABBเป็น{?.}ไม่มีการเปลี่ยนแปลงในแง่ของไบต์ แต่สิ่งนี้ทำให้เราสามารถทำให้∧?ตัวย่อ&ง่ายขึ้น

เคล็ดลับที่เกี่ยวข้องคือการเปลี่ยนแปลง

∧. … ?∧

ถึง

~{ … }

(ซึ่งสั้นกว่าหนึ่งไบต์) แต่โปรดทราบว่าเกือบถูกกว่าเสมอที่จะให้ผู้โทรมาแลกเปลี่ยนข้อโต้แย้งแทน (เว้นแต่ว่าคำกริยานั้นถูกเรียกมาจากที่ต่าง ๆ อย่างน้อยสามแห่งในโปรแกรมซึ่งหายากใน Brachylog)


3

แยกความยาว -2 ภาคแสดงภายใน metapredicates

นี่คือตัวอย่างที่อธิบายได้ดีที่สุด ในการลบองค์ประกอบแรกและสุดท้ายของรายการเรา behead และมีดมัน:

bk

หากเราต้องการดำเนินการนี้กับทุกองค์ประกอบของรายการเราสามารถใช้การดำเนินการแผนที่:

{bk}ᵐ

อย่างไรก็ตามมันสั้นกว่าเล็กน้อยในการแบ่งภาคแสดงเป็นสองส่วนและแมปแต่ละส่วนแยกกัน:

bᵐkᵐ

เคล็ดลับเดียวกันนี้สามารถใช้กับ metapredicates ได้บ้าง:

{bk}ᵐ  →  bᵐkᵐ
{bk}ˢ  →  bˢkˢ
{bk}ᶠ  →  bᶠkˢ
~{bk}  →  ~k~b

โปรดทราบว่าสำหรับ metapredicates เช่นไม่มีวิธีการทั่วไปที่จะแบ่งออกเป็นสองส่วน แต่ก็อาจเป็นไปได้ที่จะพบการสลายตัวที่เหมาะกับงานเฉพาะที่คุณกำลังทำงานอยู่


3

กำลังส่งรายการว่างไปยังสตริงว่าง

บางครั้งเมื่อทำงานกับสตริงขั้นตอนวิธีการที่เราใช้อาจจะรวมสิ่งที่เราต้องการด้วยรายการที่ว่างเปล่าเมื่อเราค่อนข้างจะต้องการสตริงที่ว่างเปล่า[]""

เราสามารถส่งรายการว่างไปยังสตริงว่างโดยใช้,Ẹซึ่งผนวกสตริงว่างกับตัวแปรด้านซ้าย (นี่เป็นการใช้ประโยชน์จากวิธีที่,ใช้)

สิ่งนี้ยังมีประโยชน์ที่จะไม่ทำอะไรเลยถ้าตัวแปรด้านซ้ายเป็นสตริง ดังนั้นหากโปรแกรมของคุณคือ

{  
   some predicate that should always output a string, 
   but actually outputs [] instead of "" in specific cases
}

แล้วก็

{
  some predicate that should always output a string, 
  but actually outputs [] instead of "" in specific cases
},Ẹ

จะทำงานในแบบที่คุณต้องการ


2

องค์ประกอบเดียวที่ทำงานในรายการ

ลองพิจารณาตัวอย่างนี้:

ḅ∋≠

หากอินพุตเป็นรายการหรือสตริงเอาต์พุตจะถูกรวมเข้าด้วยรายการย่อย / ซับสตริงที่มีความยาว 1 ซึ่งไม่ใช่ส่วนหนึ่งขององค์ประกอบที่เท่ากัน มันแยกรายการออกเป็นบล็อกขององค์ประกอบที่เท่ากันและค้นหาบล็อกที่มีองค์ประกอบต่างกันทั้งหมด ในการรับองค์ประกอบเองแทนที่จะเป็นรายการเดี่ยวhให้ไปจนสุด ฉันใช้โครงสร้างนี้ที่นี่ด้วยoเพื่อค้นหาตัวละครที่เกิดขึ้นเพียงครั้งเดียวในสายป้อน

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