Tugas Anda adalah menulis juru bahasa RoboZZle. Jika Anda tidak terbiasa dengan permainan, silakan menonton video di robozzle.com atau baca deskripsi saya di bawah ini.
Robot tinggal di kotak persegi panjang berwarna merah, hijau, biru, atau hitam. Kotak hitam tidak dapat diakses. Yang lain dapat diakses dan beberapa di antaranya berisi bintang. Tujuannya adalah untuk mengumpulkan semua bintang tanpa menginjak kotak hitam atau jatuh dari peta. Robot menempati satu kotak dan menghadap ke arah tertentu - kiri, kanan, atas, atau bawah. Ini mengikuti instruksi seperti perakitan yang dikelompokkan ke dalam subrutin F1, F2, ..., F5. Instruksi adalah sepasang predikat ("tidak ada", "jika pada warna merah", "jika pada warna hijau", "jika pada warna biru") dan sebuah tindakan ("maju", "belok kiri", "belok kanan", "belok kanan", "cat merah kotak saat ini", "cat hijau", "cat biru", "jangan apa-apa", "sebut F1", ..., "panggil F5"). Panggilan ke subrutin menggunakan tumpukan dan bisa bersifat rekursif. Sama seperti dalam pemrograman konvensional, setelah instruksi terakhir dari sebuah subrutin selesai, eksekusi berlanjut dari titik di mana subrutin itu dipanggil. Eksekusi dimulai dari instruksi pertama F1 dan berlanjut sampai robot mengunjungi semua kotak dengan bintang, atau ketika robot menginjak kotak hitam atau di luar peta, atau 1000 instruksi telah dieksekusi (predikat gagal dan tindakan "tidak melakukan apa-apa") tidak masuk hitungan), atau tidak ada instruksi lagi untuk dieksekusi (stack underflow).
Input:
a
- matriks karakter 12x16 (seperti biasanya direpresentasikan dalam bahasa Anda, mis. array string) yang menyandikan peta -'#'
untuk kotak yang tidak dapat diakses (hitam),'*'
untuk kotak dengan bintang,'.'
untuk sisanyac
- matriks karakter 12x16 yang menggambarkan warna kotak yang dapat diakses -'R'
(merah),'G'
(hijau), atau'B'
(biru). Kotak yang tidak dapat diakses akan diwakili oleh surat arbitrer dari ketiganya.y
danx
- baris dan kolom berbasis 0 robot;a[y][x]
dijamin'.'
d
- arah robot ini menghadap:0 1 2 3
untuk kanan, bawah, kiri, atas, yaitu ke arah(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- string tunggal, implementasi gabungan dari F1 ... F5. Setiap implementasi adalah urutan (kemungkinan kosong) dari pasangan tindakan predikat (paling banyak 10 pasang per subrutin), diakhiri dengan'|'
.predikat:
'_'
tidak ada,'r'
merah,'g'
hijau,'b'
birutindakan:
'F'
maju,'L'
belok kiri,'R'
belok kanan,'r'
cat merah,'g'
cat hijau,'b'
cat biru,'1'
panggil F1, ...,'5'
panggil F5,'_'
jangan lakukan apa-apa
Anda tidak harus memberi nama input seperti di atas, tetapi nilainya harus seperti yang ditentukan.
Keluaran: 1
(atau true
) jika robot mengumpulkan semua bintang sesuai dengan aturan, 0
( false
) jika tidak.
Contoh :
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)
Contoh lain , yang melibatkan instruksi "cat":
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
Untuk menghasilkan tes Anda sendiri, buka puzzle dari daftar di robozzle.com , cobalah untuk menyelesaikannya (atau tidak menyelesaikannya), tekan F12 di browser Anda, ketikkan di konsol 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()))
dan format ulang hasilnya untuk bahasa Anda.
Kemenangan terpendek. Tidak ada celah.