Su tarea es escribir un intérprete RoboZZle. Si no está familiarizado con el juego, mire el video en robozzle.com o lea mi descripción a continuación.
Un robot vive en una cuadrícula rectangular de cuadrados de color rojo, verde, azul o negro. Los cuadrados negros son inaccesibles. Los otros son accesibles y algunos contienen una estrella. El objetivo es recoger todas las estrellas sin pisar los cuadrados negros o caerse del mapa. El robot ocupa un cuadrado y se enfrenta a una dirección particular: izquierda, derecha, arriba o abajo. Sigue las instrucciones de ensamblaje agrupadas en las subrutinas F1, F2, ..., F5. Una instrucción es un par de predicados ("ninguno", "si está en rojo", "si está en verde", "si está en azul") y una acción ("ir hacia adelante", "girar a la izquierda", "girar a la derecha", "pintar el cuadrado actual de rojo", "pintarlo de verde", "pintar de azul", "no hacer nada", "llamar a F1", ..., "llamar a F5"). Las llamadas a subrutinas usan una pila y pueden ser recursivas. Al igual que en la programación convencional, después de completar la última instrucción de una subrutina, la ejecución continúa desde el punto donde se llamó a la subrutina. La ejecución comienza desde la primera instrucción de F1 y continúa hasta que el robot ha visitado todos los cuadrados con estrellas, o cuando el robot pisa un cuadrado negro o fuera del mapa, o se han ejecutado 1000 instrucciones (predicados fallidos y acciones de "no hacer nada" no cuenta), o no hay más instrucciones para ejecutar (flujo inferior de la pila).
Entradas:
a
- una matriz de 12x16 caracteres (como generalmente se representa en su idioma, por ejemplo, una serie de cadenas) que codifica un mapa -'#'
para cuadrados inaccesibles (negros),'*'
para cuadrados con una estrella,'.'
para el restoc
- una matriz de 12x16 caracteres que describe los colores de los cuadrados accesibles:'R'
(rojo),'G'
(verde) o'B'
(azul). Los cuadrados inaccesibles serán representados por una letra arbitraria de los tres.y
yx
- la fila y columna basadas en 0 del robot;a[y][x]
está garantizado para ser'.'
d
- la dirección que el robot se Orientación:0 1 2 3
para la derecha, abajo, izquierda, arriba, es decir hacia(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- una sola cadena, las implementaciones concatenadas de F1 ... F5. Cada implementación es una secuencia (posiblemente vacía) de pares de predicado-acción (como máximo 10 pares por subrutina), terminada con a'|'
.predicados:
'_'
ninguno,'r'
rojo,'g'
verde,'b'
azulacciones:
'F'
avanzar,'L'
girar a la izquierda,'R'
girar a la derecha,'r'
pintar de rojo,'g'
pintar de verde,'b'
pintar de azul,'1'
llamar a F1, ...,'5'
llamar a F5,'_'
no hacer nada
No tiene que nombrar sus entradas como las anteriores, pero sus valores deben ser los especificados.
Salida: 1
(o true
) si el robot recoge todas las estrellas de acuerdo con las reglas, 0
( false
) de lo contrario.
Ejemplo :
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)
Otro ejemplo , que implica instrucciones de "pintura":
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
Para generar su propia prueba, vaya a un rompecabezas de la lista en robozzle.com , intente resolverlo (o no resolverlo), presione F12 en su navegador, escriba la consola 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()))
y reformatee el resultado para su idioma.
Las victorias más cortas. No hay escapatorias.