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.
Respuestas:
Prólogo (SWI) , 574 bytes
Pruébalo en línea!
Esto define un predicado que cuando se llama tiene éxito si todas las estrellas se recogen con éxito y falla de lo contrario. El predicado toma los argumentos tales como:
a+c+f+x^y^d.
.a
yc
debe ser una lista de cadenas entre comillas con comillas, mientras quef
debe ser una cadena entre comillas dobles.Explicación
Este programa contiene tres predicados,
*/2
,^/2
, y+/2
. Los*/2
predicados que se definen en la primera línea son responsables de parte del procesamiento de entrada. El^/2
predicado calcula recursivamente cómo el robot se mueve paso a paso y tiene éxito si el robot recoge legalmente todas las estrellas y falla de otra manera. El+/2
predicado es el predicado principal del programa y prepara la entrada para el^/2
predicado con alguna ayuda del*/2
predicado. Tenga en cuenta que cada uno de estos predicados técnicamente solo toma dos argumentos, pero al usar operadores y la coincidencia de patrones pueden comportarse como si tuvieran más argumentos (discuto este fenómeno más en profundidad aquí ).*/2
Este predicado toma dos argumentos. La primera es una lista de listas de códigos de caracteres (así es como Prolog analiza las cadenas entre comillas con comillas). El segundo es un mapa asociativo de puntos en el mapa de 12x16 (representado como
X^Y
) a 32 más el código de caracteres almacenado en ese punto en la lista de listas de códigos de caracteres. El 32 se agrega a cada uno de los códigos de caracteres para que para la matriz de color convierta los caracteres de color en mayúsculas en caracteres de color en minúsculas.La forma en que lo hace es generar una lista de pares de puntos y los códigos de caracteres en ese punto usando
findall/3
. Luego se usalist_to_assoc/2
para crear el mapa asociativo correspondiente de los puntos al código de caracteres en ese punto.El
findall/3
predicado es un constructor que toma una "plantilla" como primer argumento, una meta como segundo argumento y una lista como tercer argumento. El predicado llena la lista con todos los valores posibles de la plantilla que hacen que el objetivo sea exitoso. Debido a la precedencia de operadores, la plantilla que se pasafindall/3
en el*/2
que se analiza como(X^Y)-D
. El-
operador representa un par de dos valores en Prolog, por lo que la plantilla representa la ubicación del punto (X^Y
) emparejado con 32 más el código de caracteres del punto (D
). Tenga en cuenta que el^
utilizado para representar el punto no está conectado de ninguna manera con el^/2
predicado.Consideremos el objetivo que se pasa al
findall/3
predicado.El objetivo contiene tres predicados, cada uno de los cuales debe tener éxito para que el objetivo tenga éxito. El
nth0/3
predicado que se usa dos veces se usa para obtener el valor en un índice particular de la lista (0
en su nombre indica que está indexado a cero). La primera llamada almacena laY
fila th de la matriz de caracteresO
mientras que la segunda llamada almacena elX
carácter th en esa filaC
. El predicado finalplus/3
tiene éxito si sus dos primeros argumentos suman su tercer argumento. Esto se usa para hacer que el código de caracteres en el par sea 32 mayor que el código de caracteres en la matriz de caracteres que, como se indicó anteriormente, convertirá todas las letras mayúsculas en minúsculas.Finalmente
findall/3
almacena todas lasX^Y-D
combinaciones que hacen que su objetivoL
tenga éxito en la lista a partir de la cual se construye el mapa asociativo.Más muy pronto...
fuente
JavaScript (ES6),
298276264 bytesGuardado 8 bytes gracias a @ngn
Toma entrada como
(a,c,x,y,d,f)
, dóndea
yc
son matrices de matrices de caracteres. Devoluciones0
o1
.Casos de prueba
Mostrar fragmento de código
Comentado
fuente
x+='2101'[d&3]-1,y+='1210'[d&3]-1
->d&=3,x+=(1-d)%2,y+=(2-d)%2
x
cambia a lo sumo 1, por lo que creo que se puede sustituirx&~15
conx&16
APL (Dyalog Classic) ,
236233 bytes-3 gracias a Erik the Outgolfer
Ahora que he regalado el bono, estoy publicando una solución de muestra para mi propio desafío. Aquí hay margen de mejora: siéntase libre de copiar y jugar más golf.
Pruébalo en línea!
Igual que el anterior, ampliado con comentarios:
fuente