Starryเป็นภาษาการเขียนโปรแกรมที่ลึกลับซึ่งประกอบไปด้วยรหัส+*.,`'
ที่คำสั่งจริงที่แสดงโดยอักขระแต่ละตัวนั้นถูกกำหนดโดยจำนวนช่องว่างด้านหน้า นั่นทำให้มันยุ่งยากแม้กระทั่งกับความท้าทายของการส่งออกคงที่เนื่องจากคำสั่งที่แตกต่างกันสามารถอธิบายจำนวนไบต์ที่ต่างกันได้อย่างมากมาย โดยเฉพาะอย่างยิ่งตัวอักษรตัวเลขมีการแสดงเอกที่ทำให้มันจำเป็นในการสร้างตัวเลขที่มีขนาดใหญ่ขึ้นโดยการดำเนินการในจำนวนที่น้อยกว่า
ดังนั้นความท้าทายนี้เกี่ยวกับการเขียนโปรแกรมที่สามารถเล่นกอล์ฟโปรแกรม Starry เช่นนั้นได้
Starry ทำงานอย่างไร
(รายละเอียดเล็ก ๆ น้อย ๆ ไม่ได้ระบุไว้ใน esolangs ดังนั้นฉันจะไปกับพฤติกรรมของล่าม Ruby )
Starry เป็นภาษาที่ใช้กองซ้อนโดยมีค่าจำนวนเต็มเดียวที่มีความแม่นยำตามอำเภอใจ (ซึ่งจะว่างเปล่าในตอนแรก)
อักขระที่มีความหมายเพียงอย่างเดียวคือ:
+*.,`'
และช่องว่าง อักขระอื่น ๆ ทั้งหมดจะถูกละเว้น แต่ละลำดับของช่องว่างตามด้วยหนึ่งในอักขระที่ไม่ใช่ช่องว่างหมายถึงคำสั่งเดียว ประเภทของการเรียนการสอนขึ้นอยู่กับตัวละครที่ไม่ใช่ช่องว่างและจำนวนช่องว่าง
คำแนะนำคือ:
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
โปรดทราบว่าล่ามจะสแกนซอร์สโค้ดสำหรับฉลากก่อนที่จะเริ่มต้นการดำเนินการดังนั้นจึงเป็นไปได้ที่จะข้ามไปข้างหน้าและข้างหลัง
แน่นอนว่า Starry ยังมีคำสั่งป้อนข้อมูล (ใช้แบบอะนา,
ล็อกถึง.
) แต่คำสั่งเหล่านั้นไม่เกี่ยวข้องกับความท้าทายนี้
ความท้าทาย
รับสตริงสร้างโปรแกรม Starry ที่ไม่มีอินพุตและพิมพ์สตริงนั้นตรงกับ STDOUT
คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์
คุณอาจคิดว่าสตริงนั้นมีความยาวไม่เกิน 128 ตัวอักษรและจะประกอบด้วยอักขระ ASCII ที่พิมพ์ได้เท่านั้น (รหัสจุด 0x20 ถึง 0x7E)
วิธีแก้ปัญหาของคุณควรประมวลผลอินพุตดังกล่าวในเวลาน้อยกว่า 5 นาทีบนเครื่องเดสก์ท็อปที่เหมาะสม (มีบางอย่างที่เกินกว่านี้ถ้าใช้เวลาเพิ่มอีกสองสามนาทีบนแล็ปท็อปของฉันฉันไม่รังเกียจ แต่ถ้าใช้เวลา 15) ฉันจะตัดสิทธิ์ มัน).
โซลูชันของคุณจะได้รับการทดสอบตามจำนวนสายอักขระต่าง ๆ ที่ระบุไว้ด้านล่าง คะแนนของคุณคือจำนวนไบต์ทั้งหมดของโปรแกรม Starry ที่เกี่ยวข้อง ในกรณีที่เสมอกันนักพนันสั้นที่สุดจะเป็นผู้ชนะ นั่นคือไม่ต้องตีกอล์ฟรหัสของคุณเองจนกว่าจะมีการผูก (ซึ่งฉันคิดว่าจะเกิดขึ้นเฉพาะในกรณีที่เป็นไปได้ทางออกที่ดีที่สุด)
คุณต้องไม่ปรับรหัสของคุณให้เหมาะสมกับกรณีทดสอบเฉพาะด้านล่าง คุณไม่ควร hardcode โซลูชันที่สร้างขึ้นด้วยมือสำหรับพวกเขา การปรับให้เหมาะสมกับคลาสของสตริงที่มีโครงสร้างคล้ายกับสตริงที่กำหนด หากฉันสงสัยว่าใครก็ตามที่ใช้โซลูชัน hardcoding ฉันขอสงวนสิทธิ์ในการแทนที่กรณีทดสอบบางส่วนหรือทั้งหมด (ด้วยสตริงของโครงสร้างที่เทียบเท่ากัน)
กรณีทดสอบ
แต่ละบรรทัดเป็นกรณีทดสอบแยก:
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
สินเชื่อสำหรับกรณีทดสอบที่สองไปที่เดนนิส เครดิตสำหรับกรณีทดสอบที่สี่ไปที่ Sp3000
โซลูชันอ้างอิง
นี่คือโซลูชันอ้างอิงพื้นฐานจริง ๆ ใน CJam:
q{S5*\iS*'+S'.}%
คุณสามารถเรียกใช้กับชุดทดสอบทั้งหมดได้ที่นี่ คะแนนที่ได้คือ:
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
มันเป็นวิธีที่ง่ายที่สุดที่เป็นไปได้: ผลักรหัสจุดของตัวละครแต่ละตัวเป็นตัวอักษรแล้วพิมพ์ออกมา มันไม่ได้ใช้ความแตกต่างเล็กน้อยระหว่างตัวละครที่ต่อเนื่องกันการพิมพ์จำนวนเต็มชิ้นส่วนซ้ำ ๆ ของสตริง ฯลฯ ฉันจะทิ้งสิ่งเหล่านั้นไว้กับคุณ
ฉันเชื่อว่ามีห้องพักมากมายสำหรับการปรับปรุง สำหรับการอ้างอิงhandcrafted ที่สั้นที่สุด "Hello, World!" มีความยาวเพียง 169 ไบต์