あなたの仕事は、RoboZZleインタープリターを作成することです。ゲームに慣れていない場合は、robozzle.comのビデオをご覧になるか、以下の説明をお読みください。
ロボットは、赤、緑、青、または黒に着色された正方形の長方形のグリッドに住んでいます。黒い四角はアクセスできません。他はアクセス可能であり、それらのいくつかは星を含んでいます。目標は、黒い四角を踏んだり、地図から落ちたりすることなく、すべての星を集めることです。ロボットは1つの正方形を占め、特定の方向(左、右、上、または下)を向きます。これは、サブルーチンF1、F2、...、F5にグループ化されたアセンブリのような命令に従います。指示は、述語(「なし」、「赤の場合」、「緑の場合」、「青の場合」)とアクション(「進む」、「左に曲がる」、「右に曲がる」)のペアです。 「現在の正方形の赤をペイント」、「緑をペイント」、「青をペイント」、「何もしない」、「F1を呼び出す」、「F5を呼び出す」)。サブルーチンの呼び出しはスタックを使用し、再帰的である場合があります。従来のプログラミングと同様に、サブルーチンの最後の命令が完了した後、サブルーチンが呼び出されたところから実行が続行されます。実行はF1の最初の命令から始まり、ロボットが星のあるすべての正方形を訪問するか、ロボットが黒い四角またはマップの外側を踏むか、1000命令が実行されるまで続きます(失敗した述語と「何もしない」アクション)カウントしない)、または実行する命令がなくなる(スタックアンダーフロー)。
入力:
a
-マップをエンコードする12x16文字のマトリックス(通常は言語で表される文字列の配列など)-'#'
アクセスできない(黒い)四角形、'*'
星付きの四角形'.'
、その他c
-アクセシブルな正方形の色を表す12x16文字のマトリックス-'R'
(赤)、'G'
(緑)、または'B'
(青)。アクセスできない正方形は、3つのうち任意の文字で表されます。y
およびx
-ロボットの0ベースの行と列。a[y][x]
であることが保証されています'.'
d
-ロボットが向いている方向:0 1 2 3
右用、下、左、上、すなわちに向けました(y,x+1)
、(y+1,x)
、(y,x-1)
、(y-1,x)
f
-単一の文字列、F1 ... F5の連結された実装。各実装は、(空の可能性がある)述語とアクションのペアのシーケンスであり(サブルーチンごとに最大10ペア)、で終了します'|'
。述語:
'_'
なし、'r'
赤、'g'
緑、'b'
青アクション:
'F'
前進、'L'
左折、'R'
右折、'r'
赤く'g'
塗る、緑に'b'
塗る、青に塗る、'1'
F1を'5'
呼び出す...、F5を呼び出す、'_'
何もしない
上記のように入力に名前を付ける必要はありませんが、それらの値は指定どおりでなければなりません。
出力:(1
またはtrue
)ロボットがルールに従ってすべての星を収集する場合、0
(false
)そうでない場合。
例:
a=["################","################","##*....*...*#.##","##.####.#####.##","##.####.#####.##","##.####*...*#.##","##.########.####","##*........*#.##","################","################","################","################"]
c=["RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRBBBBRGGGGRRRR","RRBRRRRGRRRRRRRR","RRBRRRRGRRRRRRRR","RRBRRRRRGGGBRRRR","RRBRRRRRRRRGRRRR","RRRBBBBGGGGBRBRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR"]
y=2; x=6; d=2
// and then depending on "f":
f="_FrLg2_1|_FbLrR_2||||" // result:1
f="_FrRg2_1|_FbLrR_2||||" // result:0 (stepped on a black square)
f="_FrLrL_1|_FbLrR_2||||" // result:0 (1000-step limit exceeded)
f="_FrLg2__|________||||" // result:0 (stack underflow)
「ペイント」命令を含む別の例:
a=["#***************","#*###*###*###*##","#*###*###*###*##","***#***#***#***#","***#***#***#***#","*###*###*###*###","***#***#***#***#","***#***#***#***#","***#***#***#***#","*###*###*###*###","*.*#***#***#***#","***#***#***#***#"]
c=["RGGGGGGGGGGGGGGG","RBRRRGRRRGRRRGRR","RBRRRGRRRGRRRGRR","RBRRGGGRGGGRGGGR","BRRRGGGRGGGRGGGR","BRRRGRRRGRRRGRRR","BRRRGGGRGGGRGGGR","RBRRGGGRGGGRGGGR","BRRRGGGRGGGRGGGR","BRRRGRRRGRRRGRRR","BGRRGGGRGGGRGGGR","RBRRGGGRGGGRGGGR"]
y=10; x=1; d=0
f="_2_R_R_1|_FgRgFgFg3rRr4b2_Fgb|_F_F_R|_2_L_r||"
// result:1
独自のテストを生成するには、robozzle.comのリストからパズルに移動し、それを解決する(または解決しない)ことを試み、ブラウザーでF12を押し、JSコンソールに入力します。
r=robozzle;s=JSON.stringify;with(r.level)console.log('a='+s(Items)+'\nc='+s(Colors)+'\ny='+RobotRow+'\nx='+RobotCol+'\nd='+RobotDir+'\nf='+s(r.encodeSolution()))
そしてあなたの言語に合わせて結果を再フォーマットします。
最短の勝利。抜け穴はありません。