Golf a Purple Interpreter
Purpleเป็น esolang ที่ออกแบบมาโดยมีวัตถุประสงค์หลักสองประการ:
- เพื่อเป็นการลดAubergineเนื่องจากมีเพียงภาษาตัวเองไม่เพียงพอในการปรับเปลี่ยนคำสั่งเดียว
- เพื่อยอมรับความเป็นไปได้ของล่ามกอล์ฟขนาดเล็กที่น่ากลัว การผ่านครั้งแรกของฉันที่ล่าม Python 2 ที่มีคุณสมบัติครบถ้วนสมเหตุสมผลมีเพียง 702 ไบต์และฉันแน่ใจว่านักกอล์ฟที่มีประสบการณ์มากขึ้นสามารถโกนหนวดได้เล็กน้อย
เป้าหมายของคุณคือการเขียนล่ามสำหรับภาษานี้
ข้อมูลเกี่ยวกับสีม่วง:
โปรแกรมสีม่วงคือลำดับของอักขระที่วางในอาร์เรย์หน่วยความจำที่ไม่มีที่สิ้นสุดและแอดเดรสที่อักขระตัวแรกของโปรแกรมจะถูกวางที่แอดเดรสศูนย์ ส่วนที่เหลือของอาร์เรย์ (ทั้งก่อนและหลังที่เก็บโปรแกรมสีม่วง) จะเริ่มต้นเป็นศูนย์
Purple มี register สามตัวที่เรียกว่าaและbและiซึ่งแต่ละตัวสามารถเก็บค่าจำนวนเต็มที่ลงนามแล้วและถูกกำหนดค่าเริ่มต้นเป็นศูนย์ ฉันยังเป็นตัวชี้คำสั่งและชี้ไปที่คำสั่งสีม่วงที่กำลังดำเนินการอยู่ในปัจจุบัน
แต่ละรอบล่ามจะอ่านลำดับของอักขระสามตัวที่ต่อเนื่องกันเริ่มต้นจากตำแหน่งหน่วยความจำที่ระบุโดยตัวชี้คำสั่งและพยายามเรียกใช้ลำดับนี้ตามคำสั่งสีม่วง หลังจากนั้นตัวชี้คำสั่งจะเพิ่มขึ้น 3 เสมอ
วากยสัมพันธ์คำสั่งสีม่วงประกอบด้วยอักขระสามตัว (หรือการเข้ารหัส) ในหนึ่งแถวเช่น " xyz "
อักขระตัวแรกxสามารถเป็นอย่างใดอย่างหนึ่งต่อไปนี้:
abABio
สัญลักษณ์เหล่านี้มีความหมายดังต่อไปนี้:
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
อีกสองไบต์yและzสามารถเป็นอย่างใดอย่างหนึ่งต่อไปนี้:
abABio1
แต่ละสัญลักษณ์เหล่านี้มีความหมายต่อไปนี้:
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
หลังจากดึงคำแนะนำแล้วล่ามสีม่วงจะประเมินค่าyแล้วตามด้วยzลบผลลัพธ์ของzจากผลลัพธ์ของyจากนั้นดำเนินการตามที่x กำหนดไว้บนความแตกต่าง
หากลำดับของอักขระสามตัว (หรือการเข้ารหัส) นั้นไม่ใช่คำสั่งสีม่วงที่ถูกต้องล่ามจะหยุดทันทีโดยไม่มีข้อผิดพลาดใด ๆ
ล่ามของคุณจะต้อง:
- เป็นโปรแกรมที่สมบูรณ์ไม่ใช่ฟังก์ชั่น
- ไม่เคยส่งออกไปยัง stderr, เว้นแต่ EOF คืออ่าน
- ทำตัวเหมือนกันกับการใช้งานอ้างอิงในอินพุตที่มีรูปแบบที่ดีทั้งหมดซึ่งไม่เกี่ยวข้องกับตัวเลขที่มีขนาดใหญ่มากรวมถึงโปรแกรมทดสอบที่ระบุด้านล่าง (ดีเหมือนกันถึงเวลา - มันสามารถทำงานช้าลง แต่ไม่มากเกินไป!)
คุณสามารถมอบโปรแกรมให้กับล่ามในรูปแบบใด ๆ ที่คุณต้องการ: อ่านจากไฟล์ฝังในโปรแกรมเป็นสตริงหรืออ่านจาก stdin
กรณีทดสอบ:
โปรแกรม
ooo
เมื่อทำงานกับอินพุต
z!
ควรให้ผลผลิต
Y
โปรแกรม
bbboobiii
เมื่อทำงานกับอินพุต
It's a cat program.
(หรืออินพุตอื่น ๆ ) ควรให้ผลลัพธ์
It's a cat program.
(หรือสิ่งที่มันจะได้รับการป้อนข้อมูล) แล้วเริ่มต้นและทำสิ่งเดียวกันอีกครั้ง
โปรแกรม
Aoab11bi1bABoAaiba
เมื่อทำงานกับอินพุต
0
ควรให้ผลผลิต
0
แล้วหยุด แต่เมื่อทำงานด้วยอินพุต
1
ควรส่งออกอย่างต่อเนื่อง
1
ตลอดไป
โปรแกรม
b1bbb1oAbabaa1ab1Ab1Bi1b
ควรให้ผลผลิต
b1bbb1oAbabaa1ab1Ab1Bi1b
โปรแกรม
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
ควรให้ผลผลิต
Hello, World!
เกณฑ์การให้คะแนน:
นี่คือcode-golfดังนั้นแหล่งที่สั้นที่สุดในหน่วยไบต์ตามที่อาจแก้ไขได้ด้วยโบนัสต่อไปนี้จะชนะ
โบนัส:
- -10% ถ้าล่ามของคุณอ่านชื่อไฟล์จาก stdin หรือจากอาร์กิวเมนต์บรรทัดคำสั่งและโหลดโปรแกรมจากไฟล์
uint32
สำหรับตัวละครและ MAXINT สำหรับ ints