Ihre Aufgabe ist es, einen RoboZZle-Interpreter zu schreiben. Wenn Sie mit dem Spiel nicht vertraut sind, schauen Sie sich bitte das Video auf robozzle.com an oder lesen Sie meine Beschreibung unten.
Ein Roboter lebt auf einem rechteckigen Gitter aus rot, grün, blau oder schwarz gefärbten Quadraten. Schwarze Quadrate sind nicht zugänglich. Die anderen sind zugänglich und einige enthalten einen Stern. Das Ziel ist es, alle Sterne zu sammeln, ohne auf die schwarzen Quadrate zu treten oder von der Karte zu fallen. Der Roboter nimmt ein Quadrat ein und zeigt in eine bestimmte Richtung - links, rechts, oben oder unten. Es folgt montageähnlichen Anweisungen, die in den Unterprogrammen F1, F2, ..., F5 zusammengefasst sind. Eine Anweisung ist ein Paar aus einem Prädikat ("keine", "wenn auf rot", "wenn auf grün", "wenn auf blau") und einer Aktion ("vorwärts gehen", "links abbiegen", "rechts abbiegen"). "Malen Sie das aktuelle Quadrat rot", "Malen Sie es grün", "Malen Sie es blau", "Tun Sie nichts", "Rufen Sie F1", ..., "Rufen Sie F5"). Aufrufe von Unterprogrammen verwenden einen Stapel und können rekursiv sein. Genau wie bei der herkömmlichen Programmierung wird die Ausführung nach Abschluss der letzten Anweisung eines Unterprogramms an dem Punkt fortgesetzt, an dem das Unterprogramm aufgerufen wurde. Die Ausführung beginnt mit der ersten Anweisung von F1 und wird fortgesetzt, bis entweder der Roboter alle Felder mit Sternen besucht hat oder wenn der Roboter auf ein schwarzes Quadrat oder außerhalb der Karte tritt oder 1000 Anweisungen ausgeführt wurden (fehlgeschlagene Prädikate und Aktionen "Nichts tun") nicht zählen), oder es sind keine weiteren Anweisungen auszuführen (Stapelunterlauf).
Eingaben:
a
- eine 12x16-Zeichenmatrix (wie normalerweise in Ihrer Sprache dargestellt, z. B. eine Reihe von Zeichenfolgen), die eine Karte codiert -'#'
für unzugängliche (schwarze) Quadrate,'*'
für Quadrate mit einem Stern,'.'
für den Restc
- eine 12x16-Zeichenmatrix, die die Farben der zugänglichen Quadrate beschreibt -'R'
(rot),'G'
(grün) oder'B'
(blau). Unzugängliche Quadrate werden durch einen beliebigen Buchstaben der drei dargestellt.y
undx
- die 0-basierte Zeile und Spalte des Roboters;a[y][x]
ist garantiert zu sein'.'
d
- die Richtung der Roboter Ausrichtung0 1 2 3
für rechts, unten, links, oben, dh in Richtung(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- eine einzelne Zeichenfolge, die verketteten Implementierungen von F1 ... F5. Jede Implementierung ist eine (möglicherweise leere) Folge von Prädikat-Aktions-Paaren (höchstens 10 Paare pro Unterprogramm), die mit a abgeschlossen sind'|'
.Prädikate:
'_'
keine,'r'
rot,'g'
grün,'b'
blauAktionen:
'F'
vorwärts gehen,'L'
links'R'
abbiegen, rechts abbiegen,'r'
rot'g'
malen, grün'b'
malen, blau malen,'1'
F1 anrufen, ...,'5'
F5 anrufen,'_'
nichts tun
Sie müssen Ihre Eingaben nicht wie oben angegeben benennen, aber ihre Werte müssen wie angegeben sein.
Ausgabe: 1
(oder true
) wenn der Roboter alle Sterne gemäß den Regeln sammelt, 0
( false
) andernfalls.
Beispiel :
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)
Ein weiteres Beispiel mit Anweisungen zum Malen:
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
Um Ihren eigenen Test zu generieren, gehen Sie zu einem Puzzle aus der Liste auf robozzle.com , versuchen Sie es zu lösen (oder lösen Sie es nicht), drücken Sie F12 in Ihrem Browser und geben Sie die JS-Konsole ein:
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()))
und formatieren Sie das Ergebnis für Ihre Sprache neu.
Kürzeste Siege. Keine Lücken.