มีพิธีการมากมายดังนั้นในขณะที่คุณอาจพบว่ามีแหล่งข้อมูลอื่นที่เป็นประโยชน์ฉันหวังว่าจะระบุอย่างชัดเจนว่าพวกเขาไม่จำเป็น
RM ประกอบด้วยเครื่องจักรสถานะ จำกัด และจำนวน จำกัด ของการลงทะเบียนที่มีชื่อซึ่งแต่ละรายการมีจำนวนเต็มไม่เป็นลบ เพื่อความสะดวกในการป้อนข้อความต้นฉบับงานนี้ต้องการให้มีการตั้งชื่อสถานะด้วย
สถานะมีสามประเภท: การเพิ่มและการลดลงซึ่งทั้งคู่อ้างอิงการลงทะเบียนเฉพาะ และยุติ สถานะที่เพิ่มขึ้นจะเพิ่มการลงทะเบียนและส่งการควบคุมไปยังผู้สืบทอดที่หนึ่ง สถานะการลดลงมีผู้สืบทอดสองคน: หากการลงทะเบียนไม่ใช่ศูนย์ดังนั้นจะลดลงและผ่านการควบคุมไปยังผู้สืบทอดตำแหน่งคนแรก มิฉะนั้น (เช่นการลงทะเบียนเป็นศูนย์) มันจะผ่านการควบคุมไปยังผู้สืบทอดที่สอง
สำหรับ "niceness" เป็นภาษาการเขียนโปรแกรมสถานะยุติการใช้สตริงแบบตายตัวในการพิมพ์ (เพื่อให้คุณสามารถระบุการเลิกจ้างพิเศษ)
อินพุตจาก stdin รูปแบบอินพุตประกอบด้วยหนึ่งบรรทัดต่อรัฐตามด้วยเนื้อหาการลงทะเบียนเริ่มต้น บรรทัดแรกคือสถานะเริ่มต้น BNF สำหรับสายสถานะคือ:
line ::= inc_line
| dec_line
inc_line ::= label ' : ' reg_name ' + ' state_name
dec_line ::= label ' : ' reg_name ' - ' state_name ' ' state_name
state_name ::= label
| '"' message '"'
label ::= identifier
reg_name ::= identifier
มีความยืดหยุ่นในการกำหนดตัวบ่งชี้และข้อความ โปรแกรมของคุณต้องยอมรับสตริงตัวอักษรผสมตัวเลขที่ไม่ว่างเปล่าเป็นตัวระบุ แต่อาจยอมรับสตริงทั่วไปได้มากขึ้นหากคุณต้องการ (เช่นหากภาษาของคุณรองรับตัวระบุที่มีเครื่องหมายขีดล่างและคุณสามารถทำงานได้ง่ายขึ้น) ในทำนองเดียวกันสำหรับข้อความคุณต้องยอมรับสตริงที่ไม่ใช่ตัวอักษรและช่องว่าง แต่คุณอาจยอมรับสตริงที่ซับซ้อนมากขึ้นซึ่งอนุญาตให้มีการขึ้นบรรทัดใหม่และอักขระเว้นวรรคหากคุณต้องการ
บรรทัดสุดท้ายของอินพุตซึ่งให้ค่าการลงทะเบียนเริ่มต้นคือรายการ identifier = int ที่คั่นด้วยช่องว่างซึ่งจะต้องไม่ว่างเปล่า ไม่จำเป็นต้องกำหนดค่าเริ่มต้นการลงทะเบียนทั้งหมดที่มีชื่อในโปรแกรม: ใด ๆ ที่ไม่ได้เริ่มต้นจะถือว่าเป็น 0
โปรแกรมของคุณควรอ่านอินพุตและจำลอง RM เมื่อถึงสถานะสิ้นสุดมันควรปล่อยข้อความขึ้นบรรทัดใหม่แล้วค่าของการลงทะเบียนทั้งหมด (ในความสะดวกใด ๆ ที่มนุษย์สามารถอ่านได้รูปแบบและคำสั่งใด ๆ )
หมายเหตุ: การลงทะเบียนอย่างเป็นทางการควรมีจำนวนเต็มไม่ จำกัด อย่างไรก็ตามคุณอาจคิดว่าหากไม่มีค่าลงทะเบียนเกิน 2 ^ 30
ตัวอย่างง่ายๆ
a + = b, a = 0s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4
ผลลัพธ์ที่คาดหวัง:
Ok
a=0 b=7
b + = a, t = 0
init : t - init d0
d0 : a - d1 a0
d1 : b + d2
d2 : t + d0
a0 : t - a1 "Ok"
a1 : a + a0
a=3 b=4
ผลลัพธ์ที่คาดหวัง:
Ok
a=3 b=7 t=0
กรณีทดสอบสำหรับเครื่องจักรที่ซับซ้อนกว่า
s0 : t - s0 s1
s1 : t + "t is 1"
t=17
ผลลัพธ์ที่คาดหวัง:
t is 1
t=1
และ
s0 : t - "t is nonzero" "t is zero"
t=1
ผลลัพธ์ที่คาดหวัง:
t is nonzero
t=0
ตัวอย่างที่ซับซ้อนมากขึ้น
นำมาจากการท้าทายรหัสปัญหา Josephus ของ DailyWTF อินพุตคือ n (จำนวนทหาร) และ k (ล่วงหน้า) และเอาต์พุตใน r คือตำแหน่ง (zero-indexed) ของบุคคลที่รอดชีวิต
init0 : k - init1 init3
init1 : r + init2
init2 : t + init0
init3 : t - init4 init5
init4 : k + init3
init5 : r - init6 "ERROR k is 0"
init6 : i + init7
init7 : n - loop0 "ERROR n is 0"
loop0 : n - loop1 "Ok"
loop1 : i + loop2
loop2 : k - loop3 loop5
loop3 : r + loop4
loop4 : t + loop2
loop5 : t - loop6 loop7
loop6 : k + loop5
loop7 : i - loop8 loopa
loop8 : r - loop9 loopc
loop9 : t + loop7
loopa : t - loopb loop7
loopb : i + loopa
loopc : t - loopd loopf
loopd : i + loope
loope : r + loopc
loopf : i + loop0
n=40 k=3
ผลลัพธ์ที่คาดหวัง:
Ok
i=40 k=3 n=0 r=27 t=0
โปรแกรมดังกล่าวเป็นรูปภาพสำหรับผู้ที่คิดด้วยสายตาและจะเป็นประโยชน์ในการเข้าใจไวยากรณ์: