कई औपचारिकताएं हैं, इसलिए जब आप अन्य स्रोतों को उपयोगी पा सकते हैं, तो मुझे यह स्पष्ट रूप से निर्दिष्ट करने की उम्मीद है कि वे आवश्यक नहीं हैं।
आरएम में एक परिमित राज्य मशीन और एक पंजीकृत संख्या का नाम रजिस्टर होता है, जिनमें से प्रत्येक में एक गैर-नकारात्मक पूर्णांक होता है। शाब्दिक इनपुट में आसानी के लिए इस कार्य के लिए आवश्यक है कि राज्यों का भी नाम हो।
तीन प्रकार के राज्य हैं: वेतन वृद्धि और वेतन वृद्धि, जो दोनों एक विशिष्ट रजिस्टर का संदर्भ देते हैं; और समाप्त करें। एक वेतन वृद्धि राज्य अपने रजिस्टर को बढ़ाता है और अपने एक उत्तराधिकारी को नियंत्रण देता है। एक गिरावट राज्य में दो उत्तराधिकारी होते हैं: यदि उसका रजिस्टर गैर-शून्य है तो वह इसे घटाता है और पहले उत्तराधिकारी को नियंत्रण देता है; अन्यथा (अर्थात रजिस्टर शून्य है) यह बस दूसरे उत्तराधिकारी के लिए नियंत्रण से गुजरता है।
प्रोग्रामिंग भाषा के रूप में "स्पष्टता" के लिए, समाप्त होने वाली स्थिति प्रिंट करने के लिए एक कठोर-कोडित स्ट्रिंग लेती है (ताकि आप असाधारण समाप्ति का संकेत कर सकें)।
इनपुट स्टडिन से है। इनपुट प्रारूप में प्रति पंक्ति एक पंक्ति होती है, जिसके बाद प्रारंभिक रजिस्टर सामग्री होती है। पहली पंक्ति प्रारंभिक अवस्था है। राज्य लाइनों के लिए 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
पहचानकर्ता और संदेश की परिभाषा में कुछ लचीलापन है। आपके प्रोग्राम को पहचानकर्ता के रूप में एक गैर-रिक्त अल्फ़ान्यूमेरिक स्ट्रिंग को स्वीकार करना चाहिए , लेकिन यदि आप चाहें तो यह अधिक सामान्य स्ट्रिंग्स को स्वीकार कर सकता है (जैसे कि यदि आपकी भाषा अंडरस्कोर के साथ पहचानकर्ताओं का समर्थन करती है और आपके साथ काम करना आसान है)। इसी तरह, संदेश के लिए आपको अल्फ़ान्यूमेरिक्स और रिक्त स्थान के एक गैर-रिक्त स्ट्रिंग को स्वीकार करना होगा , लेकिन आप अधिक जटिल स्ट्रिंग्स को स्वीकार कर सकते हैं, जो यदि आप चाहते हैं तो बची हुई नई-नई पंक्तियों और दोहरे-उद्धरण वर्णों की अनुमति देते हैं।
इनपुट की अंतिम पंक्ति, जो प्रारंभिक रजिस्टर मान देती है, पहचानकर्ता = अंतर असाइनमेंट की एक अलग-अलग सूची है, जो गैर-रिक्त होनी चाहिए। यह आवश्यक नहीं है कि यह प्रोग्राम में नामित सभी रजिस्टरों को इनिशियलाइज़ करता है: जो भी इनिशियलाइज़ नहीं हैं उन्हें 0 मान लिया जाता है।
आपके कार्यक्रम को इनपुट पढ़ना चाहिए और आरएम का अनुकरण करना चाहिए। जब यह एक समाप्त अवस्था में पहुंचता है तो यह संदेश, एक नई पंक्ति और फिर सभी रजिस्टरों के मूल्यों (किसी भी सुविधाजनक, मानव-पठनीय, प्रारूप और किसी भी क्रम में) का उत्सर्जन करना चाहिए।
नोट: औपचारिक रूप से रजिस्टरों को अनबाउंड पूर्णांक रखना चाहिए। हालाँकि, आप चाहें तो मान सकते हैं कि किसी भी रजिस्टर का मूल्य कभी भी 2 ^ 30 से अधिक नहीं होगा।
कुछ सरल उदाहरण
ए + = बी, ए = 0s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4
अपेक्षित परिणाम:
Ok
a=0 b=7
बी + = ए, टी = 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
एक अधिक जटिल उदाहरण
DailyWTF की जोसेफस समस्या कोड चुनौती से लिया गया। इनपुट n (सैनिकों की संख्या) और k (अग्रिम) और आउटपुट में r (शून्य अनुक्रमित) उस व्यक्ति की स्थिति है जो जीवित रहता है।
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
यह कार्यक्रम एक चित्र के रूप में, उन लोगों के लिए जो नेत्रहीन सोचते हैं और इसे वाक्यविन्यास को समझना उपयोगी होगा:
यदि आप इस गोल्फ का आनंद लेते हैं, तो अगली कड़ी देखें ।