006 - 新言語のコンパイラ
時間制限 1 秒 / メモリ制限 64 MB / 得点 13 / x 1 /
問題
世の中には様々なプログラミング言語があります。Mr.ナカムラはオリジナルのプログラミング言語を作ることに成功しました。
このプログラミング言語の変数の型は0~15の整数を扱うことが出来ます。
変数はA,B,C,Dの4つがプログラムの実行開始時にすでに宣言されており、初期値は全て0です。
これらの変数以外は使うことが出来ません。
プログラムはN行にわたって記述されており、1行に1つの命令が書かれています。
命令は次の6つを使うことが出来ます。
--------------------------------------------------------
ASSIGN a num
この命令を実行すると、変数aに値numを代入します。numには整数が与えられます。numがマイナスの値や16以上の値の可能性はあります。
ADD a b
この命令を実行すると変数aの値と変数bの値を足した結果が変数aに入ります。
SUB a b
この命令を実行すると変数aの値から変数bの値を引いた結果が変数aに入ります。
JUMP num
この命令を実行するとnum行目の命令へ移動します。numの値が1だった場合はプログラムの1行目に移動します。numは1以上N以下の正の整数です。
IF a b num1 num2
この命令を実行すると、変数aと変数bが同じ値の場合はJUMP num1を行い、変数aの値と変数bの値が違う値の場合はJUMP num2を行います。num1とnum2は1以上N以下の正の整数です。JUMPについては上の説明を見てください。
END
この命令を実行するとプログラムを終了します。
--------------------------------------------------------
プログラムは1行目から始まり、エラーが発生するかEND命令を実行しない限り終了しません。
今見ている行の命令がJUMPやIFでない場合は、今見ている行の命令が実行されたら下の行の命令へ移動します。一番下の行にいる場合は一番上の行へと移動します。
JUMPやIFで移動した場合、次に行う命令はJUMPやIFで移動した行の命令です。
さて、プログラミング言語を作ったMr.ナカムラはこの言語を用いて実際にプログラミングをしてみました。
しかし残念ながら肝心のコンパイラがないのでこのプログラムがどのような動きをするのか確かめることが出来ません。
もしかしたら変数に0~15以外の値が現れる場合があったり永久ループが起きてしまうかもしれません。
あなたはコンパイラの代わりとしてプログラムを読み取り、それを実行するプログラムを作ることにしました。
入力
N code1 code2 . . . codeN
1行目にはコードの行数Nが与えられる。Nは1以上16以下の整数である。
2行目からN行にわたってプログラムのコードが与えられる。
codeの形式は問題文を参考にすること。(行の最初に"ASSIGN","ADD","SUB","JUMP","IF","END"のどれかが与えられた後各命令によって追加の情報が入力される。)
プログラムの1行目は入力の2行目に、プログラムの2行目は入力の3行目・・・となっている。
出力
入力で与えられたプログラムを実行した結果を出力する。詳しくは下記の「出力すべき物について」を見ること。
出力すべきものについて
・プログラムの実行途中で変数の値がマイナスの値か16以上の値になった場合"OVER"を出力せよ。
・永久ループが発生する場合("OVER"に永遠にならず、かつ永遠にENDにたどり着けない場合)は"LOOP"を出力せよ。
※これら2つ以外のエラーは必ず発生しない。
・エラーがなかった場合"SUCCESS"を出力せよ。
どれにせよ出力の最後に改行を忘れないこと。
入出力例
入力例1
10 ASSIGN A 10 ASSIGN B 5 ASSIGN C 2 ADD A B SUB A C JUMP 8 ASSIGN D 100 IF A B 9 10 ASSIGN D -100 END
出力例1
SUCCESS
解説
1行目でAに10が代入されます。2行目でBに5が代入されます。3行目でCに2が代入されます。
4行目でAの値の10とBの値の5を足した値の15がAに代入されます。この変数は15まではいるのでOVERとはなりません。
5行目でAの値の15からCの値の2を引いた値の13がAに代入されます。
6行目で8行目にジャンプします。
8行目にジャンプしたため実行しませんが、ちなみに7行目の命令を実行した場合、OVERとなります。
8行目ではAとBの値を比較し、同じ値ではないため右の数字の10行目に移動します。
10行目にジャンプしたため実行しませんが、ちなみに9行目の命令を実行した場合、OVERとなります。
10行目でEND命令を実行し、SUCCESSとなります。
入力例2
3 ASSIGN A 15 ADD A A END
出力例2
OVER
解説
3行目にて、Aの値が30となり16以上となったためOVERを出力します。
入力例3
1 JUMP 1
出力例3
LOOP
解説
いつになっても1行目から抜けれないためLOOPを出力します。
入力例4
6 ASSIGN A 0 ASSIGN B 1 ASSIGN C 10 ADD A B IF A C 6 4 END
出力例4
SUCCESS
解説
for(A=0;A<10;A++)のようなものです。
入力例5
10 ASSIGN A 0 ASSIGN B 1 ASSIGN C 15 ASSIGN D 1 ADD A B IF A C 7 5 SUB A B IF A D 10 7 END JUMP 5
出力例5
LOOP
解説
ENDにたどり着けず、永久ループします。