Nhiệm vụ của bạn là viết một trình thông dịch RoboZZle. Nếu bạn không quen thuộc với trò chơi, vui lòng xem video tại robozz.com hoặc đọc mô tả của tôi dưới đây.
Một robot sống trên một lưới hình chữ nhật gồm các hình vuông có màu đỏ, xanh lá cây, xanh dương hoặc đen. Hình vuông màu đen là không thể tiếp cận. Những cái khác có thể truy cập và một số trong số chúng có chứa một ngôi sao. Mục tiêu là thu thập tất cả các ngôi sao mà không bước lên các ô vuông màu đen hoặc rơi khỏi bản đồ. Robot chiếm một hình vuông và phải đối mặt với một hướng cụ thể - trái, phải, lên hoặc xuống. Nó tuân theo các hướng dẫn giống như lắp ráp được nhóm lại thành các chương trình con F1, F2, ..., F5. Một lệnh là một cặp vị ngữ ("none", "if on red", "if on green", "if on blue") và một hành động ("đi tiếp", "rẽ trái", "rẽ phải", "Vẽ hình vuông màu đỏ hiện tại", "sơn màu xanh lá cây", "sơn màu xanh lam", "không làm gì", "gọi F1", ..., "gọi F5"). Các cuộc gọi đến chương trình con sử dụng một ngăn xếp và có thể được đệ quy. Giống như trong lập trình thông thường, sau khi hướng dẫn cuối cùng của chương trình con được hoàn thành, việc thực thi tiếp tục từ điểm mà chương trình con được gọi. Việc thực thi bắt đầu từ hướng dẫn đầu tiên của F1 và tiếp tục cho đến khi robot đã truy cập tất cả các hình vuông có ngôi sao hoặc khi robot bước trên một hình vuông màu đen hoặc bên ngoài bản đồ, hoặc 1000 lệnh đã được thực hiện (dự đoán thất bại và hành động "không làm gì" không được tính) hoặc không có thêm hướng dẫn nào để thực hiện (ngăn xếp ngăn xếp).
Đầu vào:
a
- ma trận ký tự 12x16 (như thường được biểu thị bằng ngôn ngữ của bạn, ví dụ như chuỗi các chuỗi) mã hóa bản đồ -'#'
cho các ô vuông không thể tiếp cận (màu đen),'*'
cho các hình vuông có ngôi sao,'.'
cho phần còn lạic
- ma trận ký tự 12x16 mô tả màu sắc của các ô vuông có thể truy cập -'R'
(đỏ),'G'
(xanh lá cây) hoặc'B'
(xanh lam). Các ô vuông không thể truy cập sẽ được thể hiện bằng một chữ cái tùy ý từ ba.y
vàx
- hàng và cột dựa trên 0 của robot;a[y][x]
được đảm bảo'.'
d
- hướng robot đang phải đối mặt:0 1 2 3
cho phải, xuống, trái, lên, tức là về phía(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- một chuỗi đơn, các triển khai được nối của F1 ... F5. Mỗi lần thực hiện là một chuỗi (có thể trống) các cặp hành động vị ngữ (nhiều nhất là 10 cặp trên mỗi chương trình con), được kết thúc bằng a'|'
.vị ngữ:
'_'
không có,'r'
đỏ,'g'
xanh lá cây,'b'
xanh dươnghành động:
'F'
đi tiếp,'L'
rẽ trái,'R'
rẽ phải,'r'
sơn đỏ,'g'
sơn xanh,'b'
sơn xanh,'1'
gọi F1, ...,'5'
gọi F5,'_'
không làm gì cả
Bạn không phải đặt tên cho đầu vào của mình như trên, nhưng giá trị của chúng phải được chỉ định.
Đầu ra: 1
(hoặc true
) nếu robot thu thập tất cả các ngôi sao theo quy tắc, 0
( false
) nếu không.
Ví dụ :
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)
Một ví dụ khác , liên quan đến hướng dẫn "sơn":
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
Để tạo bài kiểm tra của riêng bạn, hãy truy cập một câu đố từ danh sách tại robozz.com , cố gắng giải nó (hoặc không giải quyết nó), nhấn F12 trong trình duyệt của bạn, nhập vào bảng điều khiển 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()))
và định dạng lại kết quả cho ngôn ngữ của bạn.
Chiến thắng ngắn nhất. Không sơ hở.