บทนำ
Kippleเป็นภาษาการเขียนโปรแกรมแบบกองซ้อนซึ่งเป็นความลับที่คิดค้นโดย Rune Berg ในเดือนมีนาคม 2003
Kipple มี 27 กอง 4 ตัวดำเนินการและโครงสร้างการควบคุม
สแต็ค
สแต็กถูกตั้งชื่อa
- z
และมีจำนวนเต็ม 32 บิต นอกจากนี้ยังมีสแต็กพิเศษ@
เพื่อให้หมายเลขเอาต์พุตสะดวกยิ่งขึ้น เมื่อตัวเลขถูกส่งเข้าสู่@
ค่า ASCII ของตัวเลขนั้นจะถูกผลักเข้าไปแทน (ตัวอย่างเช่นหากคุณกด 12 ถึง@
จะได้ 49 และ 50 @
แทน)
อินพุตถูกส่งไปยังอินพุตสแต็กi
ก่อนที่โปรแกรมจะถูกดำเนินการ ล่ามจะถามหาค่าที่จะจัดเก็บi
ก่อนดำเนินการ หลังจากการดำเนินการเสร็จสิ้นสิ่งใดในเอาท์พุทสแต็คo
จะถูกตอกไปยังเอาท์พุทเป็นตัวอักษร ASCII เนื่องจากนี่เป็นเพียงกลไก IO ของ Kipple เท่านั้นการโต้ตอบกับโปรแกรม Kipple จึงเป็นไปไม่ได้
ผู้ประกอบการ
ตัวถูกดำเนินการเป็นทั้งตัวระบุสแต็กหรือจำนวนเต็ม 32 บิตลงนาม
กด: >
หรือ<
ไวยากรณ์: Operand>StackIndentifier
หรือStackIndentifier<Operand
ตัวดำเนินการพุชนำตัวถูกดำเนินการไปทางซ้ายแล้วผลักไปยังสแต็กที่ระบุ ตัวอย่างเช่น12>a
จะส่งค่า 12 ลงบนสแต็a
ก a>b
จะป๊อปอัพค่าสูงสุดจากสแต็กa
และกดลงบนสแต็b
ก การ popping สแต็กที่ว่างเปล่าส่งคืนค่า 0 a<b
จะเท่ากับb>a
เสมอ a<b>c
ปรากฏคุ้มค่าสูงสุดจากb
และผลักดันทั้งสองและc
a
เพิ่ม: +
ไวยากรณ์: StackIndentifier+Operand
ตัวดำเนินการ Add จะเพิ่มผลรวมของรายการสูงสุดบนสแต็กและตัวถูกดำเนินการไปยังสแต็ก หากตัวถูกดำเนินการเป็นสแต็กค่าจะถูกดึงจากมัน ตัวอย่างเช่นหากค่าสูงสุดของสแต็กa
คือ 1 ดังนั้นa+2
จะผลัก 3 ลงไป ถ้าa
ว่างแล้วa+2
จะกด 2 ลงไป หากค่าสูงสุดของสแต็กa
และb
เป็น 1 และ 2 แล้วa+b
จะป๊อปค่า 2 จากสแต็กb
และกด 3 ลงบนสแต็a
ก
ลบ: -
ไวยากรณ์: StackIndentifier-Operand
ตัวดำเนินการลบทำงานเหมือนกับตัวดำเนินการเพิ่มยกเว้นว่าจะลบแทนการเพิ่ม
ชัดเจน: ?
ไวยากรณ์: StackIndentifier?
ตัวดำเนินการ Clear จะล้างสแต็กหากรายการสูงสุดเป็น 0
a+2 this will be ignored c<i
ล่ามจะไม่สนใจอะไรที่ไม่ติดกับการดำเนินการเพื่อให้โปรแกรมดังต่อไปนี้จะทำงาน: อย่างไรก็ตามวิธีที่เหมาะสมในการเพิ่มความคิดเห็นคือการใช้#
ตัวละคร สิ่งใดระหว่าง a #
และอักขระสิ้นสุดบรรทัดจะถูกลบออกก่อนดำเนินการ อักขระ ASCII # 10 ถูกกำหนดเป็น end-of-line ใน Kipple
ถูกดำเนินการอาจจะใช้ร่วมกันโดยสองผู้ประกอบการเช่นอาจจะเขียนเป็นa>b c>b c?
a>b<c?
โปรแกรมที่1>a<2 a+a
จะส่งผลให้a
มีค่า[1 4]
(จากล่างขึ้นบน) [1 3]
และไม่ได้ ในทำนองเดียวกันสำหรับ-
ผู้ประกอบการ
โครงสร้างการควบคุม
Kipple มีโครงสร้างการควบคุมเดียวเท่านั้น: การวนซ้ำ
ไวยากรณ์: (StackIndentifier code )
ตราบใดที่สแต็กที่ระบุไม่ว่างเปล่าโค้ดภายในวงเล็บที่ตรงกันจะถูกทำซ้ำ ลูปอาจมีลูปอื่น ยกตัวอย่างเช่น(a a>b)
จะย้ายค่าทั้งหมดของสแต็คa
บนสแต็คb
แม้ว่าจะสั่งซื้อจะถูกกลับรายการ วิธีหน้าที่เหมือน (a>b)
แต่สง่างามมากขึ้นที่จะทำคือ
ตัวอย่าง
100>@ (@>o)
สิ่งนี้จะออก 100
33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o
"Hello World!"
นี้จะพิมพ์ เมื่อo
สแต็กกำลังถูกเอาต์พุตมันจะเริ่มป๊อปอักขระจากด้านบนของสแต็กไปด้านล่าง
#prime.k by Jannis Harder
u<200
#change 200
k<2>m
u-2
(u-1 u>t u>z u<t
(k>e e+0 e>r)
(e>k)
m+1
m>t
m>z
m<t
t<0>z? t?
1>g
(r>b
m+0 m>a
b+0 b>w
(a-1
b+0 b>j
j?
1>s
(j<0>s j?)
s?
(s<0 w+0 w>b s?)
a>t
a>z
t>a
b-1
b>t
b>z
t>b
z<0>t? z?
a?)
b?
1>p
(b<0 b? 0>p)
p?
(p 0>r? 0>p? 0>g)
)
g?
(g m+0 m>k 0>g?)
u?)
(k>@
10>o
(@>o)
)
นี่คือตัวสร้างจำนวนเฉพาะ แต่ฉันไม่แน่ใจว่ามันทำงานอย่างไร
กฎระเบียบ
คุณต้องเขียนโปรแกรม / ฟังก์ชั่นที่ตีความ Kipple โปรแกรม / ฟังก์ชั่นนี้อาจได้รับโปรแกรม Kipple ผ่านไฟล์ต้นฉบับหรือรับมันผ่าน STDIN โดยตรงจากผู้ใช้ หาก STDIN ไม่พร้อมใช้งานจะต้องได้รับจากอินพุตคีย์บอร์ดและดำเนินการรับอินพุตต่อไปจนกว่าจะป้อนอักขระที่ไม่สามารถพิมพ์ได้ ตัวอย่างเช่นหากล่ามของคุณเขียนด้วยรหัสเครื่อง x86 มันจะได้รับตัวอักษรโปรแกรม Kipple ตามตัวอักษรจากแป้นพิมพ์และทำต่อไปจนกว่าจะกดesc(หรือปุ่มอื่นใดที่ไม่ได้พิมพ์อักขระที่พิมพ์ได้)
หากมีข้อผิดพลาดเช่นไวยากรณ์ผิดพลาดหรือแตกล้นก็จะต้องยอมรับมันในบางวิธีเช่นโดยการกลับมา 10 แทน 0 หรือข้อความที่ผลิตโดยล่าม / เรียบเรียงข้อผิดพลาดแต่ไม่พิมพ์ข้อความผิดพลาด
กฎทั่วไปอื่น ๆ สำหรับการตีกอล์ฟจะมีผลกับความท้าทายนี้
รหัสของคุณจะถูกทดสอบพร้อมกับตัวอย่างบางส่วนในคลังเก็บตัวอย่างของ Kipple
นี่คือรหัสกอล์ฟ โค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ โชคดี!
โปรดทราบว่ามีโอเปอเรเตอร์เสริมใน Kipple "
แต่มันไม่ได้เป็นส่วนหนึ่งของข้อมูลจำเพาะและเป็นเพียงคุณสมบัติพิเศษในล่ามอย่างเป็นทางการ ฉันไม่ได้พูดถึงที่นี่ดังนั้นจึงไม่จำเป็นต้องได้รับการสนับสนุนในการส่งของคุณ
หากคุณมีข้อสงสัยเกี่ยวกับส่วนหนึ่งของข้อกำหนดใด ๆ ที่คุณสามารถตรวจสอบกับล่ามอย่างเป็นทางการเขียนใน Java นี่จะดาวน์โหลดไฟล์ zip ที่มีโปรแกรมที่คอมไพล์และซอร์สโค้ด มันได้รับอนุญาตภายใต้ GPL
i
อย่างไรถ้าฉันใช้ซอร์สโปรแกรมจาก stdin