多くの形式がありますので、他の情報源が役立つと思うかもしれませんが、それらが必要でないように十分明確に指定したいと思います。
RMは、有限状態マシンと有限数の名前付きレジスタで構成され、各レジスタには非負の整数が保持されます。テキスト入力を簡単にするために、このタスクでは状態にも名前を付ける必要があります。
状態には3つのタイプがあります。増分と減分です。どちらも特定のレジスタを参照します。そして終了します。インクリメント状態はレジスタをインクリメントし、制御を1つの後続に渡します。デクリメント状態には2つの後続操作があります。レジスタがゼロ以外の場合、デクリメントして最初の後続操作に制御を渡します。それ以外の場合(つまり、レジスターがゼロ)、制御を2番目の後続に単純に渡します。
プログラミング言語としての「ナイスネス」の場合、終了状態はハードコードされた文字列を使用して印刷します(したがって、例外終了を示すことができます)。
入力は標準入力からです。入力形式は、状態ごとに1行で構成され、その後に初期レジスタの内容が続きます。最初の行は初期状態です。状態ラインの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
より複雑な例
DailyWTFのJosephus問題コードチャレンジから取得。入力は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
視覚的に考え、構文を理解することが役立つと思う人のための、画像としてのプログラム
このゴルフを楽しんだ場合は、続編をご覧ください。