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.
Antworten:
Prolog (SWI) , 574 Bytes
Probieren Sie es online aus!
Dies definiert ein Prädikat, das beim Aufruf erfolgreich ist, wenn alle Sterne erfolgreich gesammelt wurden, und ansonsten fehlschlägt. Das Prädikat nimmt die Argumente als solche :
a+c+f+x^y^d.
.a
undc
muss eine Liste von Zeichenfolgen mit Backtick-Anführungszeichen sein, währendf
es sich um eine Zeichenfolge mit doppelten Anführungszeichen handeln muss.Erläuterung
Dieses Programm enthält drei Prädikate
*/2
,^/2
und+/2
. Die*/2
in der ersten Zeile definierten Prädikate sind für einen Teil der Eingabeverarbeitung verantwortlich. Das^/2
Prädikat berechnet rekursiv, wie sich der Roboter Schritt für Schritt bewegt, und ist erfolgreich, wenn der Roboter legal alle Sterne sammelt und ansonsten fehlschlägt. Das+/2
Prädikat ist das Hauptprädikat des Programms und bereitet die Eingabe für das^/2
Prädikat mit Hilfe des*/2
Prädikats vor. Beachten Sie, dass jedes dieser Prädikate technisch nur zwei Argumente akzeptiert, sich jedoch mithilfe von Operatoren und Mustervergleich so verhalten kann, als hätten sie mehr Argumente (ich diskutiere dieses Phänomen hier ausführlicher ).*/2
Dieses Prädikat benötigt zwei Argumente. Die erste ist eine Liste von Listen mit Zeichencodes (so analysiert Prolog Backtick-Zeichenfolgen in Anführungszeichen). Die zweite ist eine assoziative Zuordnung von Punkten in der 12x16-Zuordnung (dargestellt als
X^Y
) zu 32 plus dem Zeichencode, der an diesem Punkt in der Liste der Listen von Zeichencodes gespeichert ist. Die 32 wird zu jedem der Zeichencodes hinzugefügt, so dass für die Farbmatrix die Großbuchstaben in Kleinbuchstaben umgewandelt werden.Auf diese Weise wird eine Liste von Punktpaaren und die Zeichencodes an diesem Punkt mithilfe von generiert
findall/3
. Anschließend wirdlist_to_assoc/2
die entsprechende assoziative Zuordnung von Punkten zum Zeichencode an diesem Punkt erstellt.Das
findall/3
Prädikat ist ein eingebautes Prädikat, das als erstes Argument eine "Vorlage", als zweites Argument ein Ziel und als drittes Argument eine Liste verwendet. Das Prädikat füllt die Liste mit allen möglichen Werten der Vorlage, die zum Erfolg des Ziels führen. Aufgrund der Priorität des Operators wird die Vorlage, an diefindall/3
in übergeben*/2
wird, als analysiert(X^Y)-D
. Der-
Operator repräsentiert ein Paar von zwei Werten in Prolog, sodass die Vorlage die Position (X^Y
) des Punktes ( ) zusammen mit 32 plus dem Zeichencode (D
) des Punktes darstellt . Beachten Sie, dass das^
zur Darstellung des Punkts verwendete Element in keiner Weise mit dem^/2
Prädikat verbunden ist.Betrachten wir das Ziel, das an das
findall/3
Prädikat übergeben wird.Das Ziel enthält drei Prädikate, von denen jedes erfolgreich sein muss, damit das Ziel erfolgreich ist. Das
nth0/3
Prädikat, das zweimal verwendet wird, wird verwendet, um den Wert an einem bestimmten Index der Liste abzurufen (der0
in seinem Namen gibt an, dass er mit Null indiziert ist). Der erste Aufruf speichert dieY
dritte Zeile der Zeichenmatrix in,O
während der zweite Aufruf das dritteX
Zeichen in dieser Zeile speichertC
. Das letzte Prädikat istplus/3
erfolgreich, wenn die ersten beiden Argumente das dritte Argument ergeben. Dies wird verwendet, um den Zeichencode im Paar 32 größer als den Zeichencode in der Zeichenmatrix zu machen, wodurch, wie oben angegeben, alle Großbuchstaben in Kleinbuchstaben umgewandelt werden.Schließlich
findall/3
speichert alle derX^Y-D
Kombinationen , die ihr Ziel führen in der Liste um erfolgreich zu sein ,L
die die assoziative Karte von gebaut wird .Mehr folgt bald...
quelle
JavaScript (ES6),
298276264 Byte8 Bytes dank @ngn gespeichert
Nimmt Eingaben als
(a,c,x,y,d,f)
, woa
undc
sind Arrays von Arrays von Zeichen. Rückgabe0
oder1
.Testfälle
Code-Snippet anzeigen
Kommentiert
quelle
x+='2101'[d&3]-1,y+='1210'[d&3]-1
->d&=3,x+=(1-d)%2,y+=(2-d)%2
x
Änderungen von höchstens 1, so dass ich denke , Sie ersetzen könnenx&~15
mitx&16
APL (Dyalog Classic) ,
236233 Byte-3 danke an Erik den Outgolfer
Nachdem ich den Bonus verschenkt habe, veröffentliche ich eine Beispiellösung für meine eigene Herausforderung. Hier gibt es Raum für Verbesserungen - Sie können gerne weiter kopieren und Golf spielen.
Probieren Sie es online aus!
Gleich wie oben, erweitert mit Kommentaren:
quelle