Sua tarefa é escrever um intérprete RoboZZle. Se você não conhece o jogo, assista ao vídeo em robozzle.com ou leia minha descrição abaixo.
Um robô vive em uma grade retangular de quadrados coloridos de vermelho, verde, azul ou preto. Quadrados pretos são inacessíveis. Os outros são acessíveis e alguns deles contêm uma estrela. O objetivo é coletar todas as estrelas sem pisar nos quadrados pretos ou cair no mapa. O robô ocupa um quadrado e enfrenta uma direção específica - esquerda, direita, cima ou baixo. Segue instruções de montagem agrupadas nas sub-rotinas F1, F2, ..., F5. Uma instrução é um par de predicado ("nenhum", "se estiver em vermelho", "se estiver em verde", "se estiver em azul") e uma ação ("vá em frente", "vire à esquerda", "vire à direita", "pinte o quadrado atual de vermelho", "pinte de verde", "pinte de azul", "não faça nada", "chame F1", ..., "chame F5"). As chamadas para sub-rotinas usam uma pilha e podem ser recursivas. Assim como na programação convencional, após a conclusão da última instrução de uma sub-rotina, a execução continua a partir do ponto em que a sub-rotina foi chamada. A execução começa na primeira instrução da F1 e continua até que o robô tenha visitado todos os quadrados com estrelas, ou quando o robô pisa em um quadrado preto ou fora do mapa, ou 1000 instruções foram executadas (falhas de predicados e ações "não fazer nada") não conte) ou não há mais instruções para executar (pilha insuficiente).
Entradas:
a
- uma matriz de caracteres de 12x16 (como normalmente representada no seu idioma, por exemplo, conjunto de seqüências de caracteres) que codifica um mapa -'#'
para quadrados inacessíveis (pretos),'*'
para quadrados com uma estrela,'.'
para o restoc
- uma matriz de caracteres de 12x16 que descreve as cores dos quadrados acessíveis -'R'
(vermelho),'G'
(verde) ou'B'
(azul). Quadrados inacessíveis serão representados por uma carta arbitrária dos três.y
ex
- a linha e coluna com base em 0 do robô;a[y][x]
é garantido para ser'.'
d
- a direção que o robô está enfrentando:0 1 2 3
para a direita, para baixo, esquerda, para cima, ou seja, para(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- uma única sequência, as implementações concatenadas de F1 ... F5. Cada implementação é uma sequência (possivelmente vazia) de pares de ação de predicado (no máximo 10 pares por sub-rotina), finalizada com a'|'
.predicados:
'_'
nenhum,'r'
vermelho,'g'
verde,'b'
azulações:
'F'
vá em frente,'L'
vire à esquerda,'R'
vire à direita,'r'
pinte de vermelho,'g'
pinte de verde,'b'
pinte de azul,'1'
ligue para F1, ...,'5'
ligue para F5,'_'
não faça nada
Você não precisa nomear suas entradas como acima, mas seus valores devem ser os especificados.
Saída: 1
(ou true
) se o robô coletar todas as estrelas de acordo com as regras, 0
( false
) caso contrário.
Exemplo :
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)
Outro exemplo , envolvendo instruções 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 gerar seu próprio teste, vá para um quebra-cabeça da lista em robozzle.com , tente resolvê-lo (ou não), pressione F12 no seu navegador, digite o console 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()))
e reformate o resultado para o seu idioma.
Vitórias mais curtas. Sem brechas.