Il tuo compito è scrivere un interprete RoboZZle. Se non hai familiarità con il gioco, guarda il video su robozzle.com o leggi la mia descrizione di seguito.
Un robot vive su una griglia rettangolare di quadrati colorati di rosso, verde, blu o nero. I quadrati neri sono inaccessibili. Gli altri sono accessibili e alcuni contengono una stella. L'obiettivo è quello di raccogliere tutte le stelle senza calpestare i quadrati neri o cadere dalla mappa. Il robot occupa un quadrato e si trova in una direzione particolare: sinistra, destra, su o giù. Segue le istruzioni di assemblaggio raggruppate in subroutine F1, F2, ..., F5. Un'istruzione è una coppia di predicato ("none", "if on red", "if on green", "if on blue") e un'azione ("vai avanti", "gira a sinistra", "gira a destra", "dipingi il quadrato rosso attuale", "dipingilo di verde", "dipingilo di blu", "non fare nulla", "chiama F1", ..., "chiama F5"). Le chiamate alle subroutine utilizzano uno stack e possono essere ricorsive. Proprio come nella programmazione convenzionale, dopo che è stata completata l'ultima istruzione di una subroutine, l'esecuzione prosegue dal punto in cui è stata chiamata la subroutine. L'esecuzione inizia dalla prima istruzione di F1 e continua fino a quando il robot non ha visitato tutti i quadrati con le stelle, o quando il robot cammina su un quadrato nero o fuori dalla mappa, o sono state eseguite 1000 istruzioni (predicati falliti e azioni "non fare nulla" non contare) o non ci sono più istruzioni da eseguire (stack underflow).
ingressi:
a
- una matrice di caratteri 12x16 (come di solito rappresentata nella tua lingua, ad esempio una matrice di stringhe) che codifica una mappa -'#'
per quadrati inaccessibili (neri),'*'
per quadrati con una stella,'.'
per il restoc
- una matrice di caratteri 12x16 che descrive i colori dei quadrati accessibili -'R'
(rosso),'G'
(verde) o'B'
(blu). I quadrati inaccessibili saranno rappresentati da una lettera arbitraria dei tre.y
ex
- la riga e la colonna a base di 0 del robot;a[y][x]
è garantito per essere'.'
d
- la direzione del robot è rivestimento:0 1 2 3
per destra, giù, sinistra, su, cioè verso(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- una singola stringa, le implementazioni concatenate di F1 ... F5. Ogni implementazione è una sequenza (possibilmente vuota) di coppie predicato-azione (al massimo 10 coppie per subroutine), terminata con a'|'
.predicati:
'_'
nessuno,'r'
rosso,'g'
verde,'b'
bluazioni:
'F'
vai avanti,'L'
gira a sinistra,'R'
gira a destra,'r'
dipingi di rosso,'g'
dipingi di verde,'b'
dipingi di blu,'1'
chiama F1, ...,'5'
chiama F5,'_'
non fare nulla
Non è necessario nominare gli input come sopra, ma i loro valori devono essere come specificato.
Output: 1
(o true
) se il robot raccoglie tutte le stelle in base alle regole, 0
( false
) altrimenti.
Esempio :
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)
Un altro esempio , che coinvolge le istruzioni "vernice":
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
Per generare il tuo test, vai a un puzzle dall'elenco su robozzle.com , prova a risolverlo (o non risolverlo), premi F12 nel tuo browser, digita la 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 riformatta il risultato per la tua lingua.
Vittorie più brevi. Nessuna scappatoia.