Votre tâche consiste à écrire un interpréteur RoboZZle. Si vous n'êtes pas familier avec le jeu, veuillez regarder la vidéo sur robozzle.com ou lire ma description ci-dessous.
Un robot vit sur une grille rectangulaire de carrés de couleur rouge, verte, bleue ou noire. Les carrés noirs sont inaccessibles. Les autres sont accessibles et certains contiennent une étoile. Le but est de collecter toutes les étoiles sans marcher sur les carrés noirs ni tomber de la carte. Le robot occupe une case et fait face à une direction particulière - gauche, droite, haut ou bas. Il suit les instructions de type assemblage regroupées en sous-programmes F1, F2, ..., F5. Une instruction est une paire de prédicats ("aucun", "si rouge", "si vert", "si bleu") et une action ("aller de l'avant", "tourner à gauche", "tourner à droite", "peindre le carré actuel en rouge", "peindre en vert", "peindre en bleu", "ne rien faire", "appeler F1", ..., "appeler F5"). Les appels aux sous-programmes utilisent une pile et peuvent être récursifs. Tout comme dans la programmation conventionnelle, une fois la dernière instruction d'un sous-programme terminée, l'exécution se poursuit à partir du point où le sous-programme a été appelé. L'exécution commence à partir de la première instruction de F1 et se poursuit jusqu'à ce que le robot ait visité toutes les cases avec des étoiles, ou lorsque le robot marche sur un carré noir ou à l'extérieur de la carte, ou que 1000 instructions aient été exécutées (prédicats en échec et actions "ne rien faire" ne compte pas), ou il n'y a plus d'instructions à exécuter (sous-dépassement de pile).
Contributions:
a
- une matrice de 12x16 caractères (comme généralement représentée dans votre langue, par exemple un tableau de chaînes) qui code une carte -'#'
pour les carrés inaccessibles (noirs),'*'
pour les carrés avec une étoile,'.'
pour le restec
- une matrice de 12x16 caractères décrivant les couleurs des carrés accessibles -'R'
(rouge),'G'
(vert) ou'B'
(bleu). Les carrés inaccessibles seront représentés par une lettre arbitraire des trois.y
etx
- la ligne et la colonne de base 0 du robot;a[y][x]
est garanti d'être'.'
d
- la direction du robot est tourné vers:0 1 2 3
pour la droite, vers le bas, à gauche, en haut, à savoir vers(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- une seule chaîne, les implémentations concaténées de F1 ... F5. Chaque implémentation est une séquence (éventuellement vide) de paires action-prédicat (au plus 10 paires par sous-programme), terminée par un'|'
.prédicats:
'_'
aucun,'r'
rouge,'g'
vert,'b'
bleuactions:
'F'
avancer,'L'
tourner à gauche,'R'
tourner à droite,'r'
peindre rouge,'g'
peindre vert,'b'
peindre bleu,'1'
appeler F1, ...,'5'
appeler F5,'_'
ne rien faire
Vous n'avez pas besoin de nommer vos entrées comme ci-dessus, mais leurs valeurs doivent être telles que spécifiées.
Sortie: 1
(ou true
) si le robot recueille toutes les étoiles selon les règles, 0
( false
) sinon.
Exemple :
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 autre exemple , impliquant des instructions de "peinture":
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
Pour générer votre propre test, accédez à un puzzle de la liste sur robozzle.com , essayez de le résoudre (ou de ne pas le résoudre), appuyez sur F12 dans votre navigateur, tapez dans 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()))
et reformatez le résultat pour votre langue.
Victoires les plus courtes. Pas de failles.