พื้นหลัง
L-ระบบ (หรือระบบ Lindenmayer) เป็นระบบการเขียนแบบขนานที่เหนือสิ่งอื่น ๆ ที่สามารถใช้งานได้ง่ายเพื่อ fractals รุ่น คำถามนี้เกี่ยวข้องกับการกำหนดบริบทฟรี L-ระบบ สิ่งเหล่านี้ประกอบด้วยตัวอักษรของสัญลักษณ์สตริงสัจพจน์เริ่มต้นและชุดของกฎการเขียนใหม่การแมปสัญลักษณ์ตัวอักษรแต่ละตัวกับสายอักขระใหม่ กฎถูกนำไปใช้กับสัจพจน์ในแบบคู่ขนานสร้างสตริงใหม่ กระบวนการนี้ซ้ำแล้วซ้ำอีก
ตัวอย่างเช่นระบบที่มีสัจพจน์ "A" และกฎ A = ABA; B = BBB สร้างลำดับของสตริง "ABA", "ABABBBABA", "ABABBBABABBBBBBBBBABABBBABA" อย่างชัดเจนเราไม่ได้กล่าวถึง ตัวอักษรเมื่อกำหนดระบบ L นอกจากนี้สัญลักษณ์ใด ๆ ที่ไม่มีกฎการเขียนที่ชัดเจนจะถือว่าไม่มีการเปลี่ยนแปลง (เช่นกฎเริ่มต้นสำหรับสัญลักษณ์ A คือ A = A)
ระบบ L สามารถมองเห็นได้โดยใช้รูปแบบของกราฟิกเต่า โดยการประชุมเต่าเริ่มหันหน้าไปทางขวา สตริงจะถูกดึงโดยการวนซ้ำสัญลักษณ์: F หมายถึง "ดึงไปข้างหน้าหนึ่งหน่วย", G หมายถึง "เคลื่อนที่ไปข้างหน้าหนึ่งยูนิต", + หมายถึง "เลี้ยวซ้ายหนึ่งมุมหน่วย" และ a - หมายถึง "เลี้ยวขวาหนึ่งมุม หน่วย" สัญลักษณ์อื่นทั้งหมดในสตริงจะถูกละเว้น สำหรับจุดประสงค์ของคำถามนี้หน่วยมุมจะถือว่าเป็น 90 °
งาน
ด้วยข้อกำหนดของระบบ L และการวนซ้ำจำนวนมากโปรแกรมของคุณควรแสดงผล ASCII ของสตริงผลลัพธ์ (ดังอธิบายข้างต้น) โดยใช้อักขระวาดกล่อง
- พารามิเตอร์ถูกส่งผ่านเป็นสตริงที่คั่นด้วยช่องว่างซึ่งประกอบด้วยสัจพจน์กฎการเขียนซ้ำ (เป็น; - แยกรายการสมการ) และจำนวนการเขียนซ้ำซ้ำ ตัวอย่างเช่นอินพุต "FF = FGF; G = GGG 2" สร้างสตริง "FGFGGGFGF" และดึงสี่บรรทัดด้วยช่องว่างที่เหมาะสม
- สัญลักษณ์ที่ใช้โดยระบบ L สามารถเป็นอักขระ ASCII ใด ๆ นอกเหนือจากช่องว่างและเครื่องหมายอัฒภาค มีกฎที่ชัดเจนอย่างน้อยหนึ่งกฎต่อสัญลักษณ์ (โดยกฎการเขียนซ้ำเริ่มต้นคือการแมปข้อมูลประจำตัวตามที่อธิบายไว้ข้างต้น)
- คุณสามารถสันนิษฐานได้ว่าผลลัพธ์จะมีอย่างน้อยหนึ่ง F
- เอาท์พุทควรใช้อักขระวาดเขียนกล่อง UNICODEต่อไปนี้เพื่อเป็นตัวแทนของการสร้างภาพ: ─ (U + 2500), │ (U + 2502), ┌ (U + 250C), ┐ (U + 2510), └ (U + 2514) , ┘ (U + 2518), ├ (U + 251C), ┤ (U + 2524), ┬ (U + 252C), ┴ (U + 2534), ┼ (U + 253C), ╴ (U + 2574), ╵ (U + 2575), ╶ (U + 2576) และ╷ (U + 2577) ดูตัวอย่างด้านล่าง
- ผลลัพธ์ไม่ควรมีบรรทัดว่างด้านบนอักขระกล่องด้านบนสุดหรือต่ำกว่าบรรทัดล่างสุด นอกจากนี้ยังไม่ควรมีช่องว่างทางด้านซ้ายของตัวกล่องซ้ายสุดหรือทางขวาของช่องขวาสุด บรรทัดที่มีช่องว่างต่อท้ายที่ไม่ขยายเกินอักขระกล่องด้านขวาสุดจะได้รับอนุญาต
คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นรับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชัน ผลลัพธ์ควรพิมพ์ลงใน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด) บันทึกลงไฟล์หรือส่งคืนเป็นสตริง
ตัวอย่าง
# Cantor dust
>> "F F=FGF;G=GGG 0"
╶╴
>> "F F=FGF;G=GGG 1"
╶╴╶╴
>> "F F=FGF;G=GGG 2"
╶╴╶╴ ╶╴╶╴
>> "F F=FGF;G=GGG 3"
╶╴╶╴ ╶╴╶╴ ╶╴╶╴ ╶╴╶╴
# Koch curve
>> "F F=F+F−F−F+F 1"
┌┐
╶┘└╴
>> "F F=F+F-F-F+F 2"
┌┐
┌┘└┐
┌┘ └┐
┌┼┐ ┌┼┐
╶┘└┘ └┘└╴
ตัวอย่างอื่น ๆ สำหรับทดสอบโปรแกรมของคุณประกอบด้วย:
# Dragon curve
>> "FX X=X+YF+;Y=-FX-Y n"
# Hilbert curve
>> "A A=-BF+AFA+FB-;B=+AF-BFB-FA+ n"
# Sierpinski carpet
>> "F F=F+F-F-F-G+F+F+F-F;G=GGG n"
สองรายการแรกมีลักษณะดังนี้ (ผลิตโดยใช้คำตอบของ @ edc65):
คุณสามารถทดสอบระบบใด ๆ ในหน้านี้
เกณฑ์การให้คะแนน
รหัสที่สั้นที่สุด (เป็นไบต์) ชนะ ใช้กฎมาตรฐาน
Miscellania
ความท้าทายนี้เป็นแรงบันดาลใจวาดเดินสุ่มกับ Slashes ในความเป็นจริงมันเป็นไปได้ที่จะเป็นตัวแทนของการเดินสุ่มเป็น L-ระบบถ้าเราขยายระบบเพื่อให้กฎหลายต่อสัญลักษณ์มีการขยายตัวที่เลือกไม่ใช่ determisticallyในระหว่างการเขียนใหม่ สูตรหนึ่งคือ:
"F F=FF;F=F+F;F=F++F;F=F+++F"
ส่วนขยายที่ใช้ร่วมกันอื่นซึ่งมักใช้เมื่อสร้างแบบจำลองพืชคือการตีความอักขระ [และ] เป็นการกดและ popping ตำแหน่งและมุมปัจจุบัน พืชส่วนใหญ่ใช้มุมที่เล็กกว่า 90 ° แต่นี่คือตัวอย่างหนึ่งที่ไม่:
"FAX X=[-FAX][FAX][+FAX];A=AFB;B=A"
ตัวอย่างเหล่านี้ไม่จำเป็นต้องได้รับการสนับสนุนในการท้าทายนี้
ความท้าทายนี้ก็คล้ายกับ"ขอโทษที่ชายหนุ่ม แต่เต่าลงมา!" . อย่างไรก็ตามความท้าทายนั้นใช้การเรนเดอร์บรรทัดมากกว่า ASCII และอนุญาตให้ใช้ไวยากรณ์ที่ยืดหยุ่นมากขึ้น