Willkommen zurück! Ich freue mich darauf, die 3. CodeBots-Herausforderung zu präsentieren. Dieser ist schon lange in Arbeit. Diese Herausforderung wird in drei Abschnitte unterteilt: die kurze Version, die lange Version und zusätzliche Details.
Die kurze Version
Jeder Teilnehmer schreibt ein Programm mit 24 Befehlen. Diese Bots bewegen sich auf der ganzen Welt und kopieren ihren Code in andere Bots, während sie versuchen, andere Bots daran zu hindern, dasselbe zu tun. Einer der möglichen Befehle ist das No-Op Flag
. Wenn ein Bot mehr von dir hat Flag
als jeder andere Flag
, bekommst du einen Punkt. Sie gewinnen mit den meisten Punkten.
All dies traf auf die letzten beiden Herausforderungen zu. Diesmal können Bots mehrere Codezeilen gleichzeitig ausführen.
Die lange Version
Die API
Jeder Bot hat genau 24 Zeilen, wobei jede Zeile das folgende Format hat:
$label command parameters //comments
Beschriftungen und Kommentare sind optional, und jeder Befehl verfügt über eine andere Anzahl von Parametern. Alles ist unabhängig von Groß- und Kleinschreibung.
Parameter
Parameter sind typisiert und können in den folgenden Formaten vorliegen:
- Ein Wert von 0 bis 23.
- Eine Variable:
A
,B
,C
,D
- Ein Wert mit Zusatz:
A+3
oder2+C
- Eine Codezeile, die mit dem
#
Vorzeichen bezeichnet wird (#4
würde die 5. Zeile darstellen, während#C+2
die durch berechnete Zeile darstellen würdeC+2
). - Sie können eine
$label
anstelle einer Codezeile verwenden. - Die Variable oder Codezeile Ihres Gegners, bezeichnet mit
*
. Ihr Gegner ist der Bot auf dem Feld, dem Sie gegenüberstehen. (*B
Stellt denB
Wert deines Gegners dar , während*#9
die 10. Linie deines Gegners darstellt). Befindet sich niemand in diesem Feld, wird der Befehl nicht ausgeführt.
Befehle
Bewegen Sie V
Bewegt den Bot North+(V*90 degrees clockwise)
. Bewegung ändert nicht die Richtung.
Biegen Sie ab in die V
Dreht den Bot V*90 degrees
im Uhrzeigersinn.
Kopieren Sie VW
Kopien , was in ist V
in W
. Wenn V
es sich um eine Zeilennummer handelt, W
muss es sich um eine Zeilennummer handeln. Wenn V
es sich um eine Variable oder einen Wert handelt, W
muss es sich um eine Variable handeln.
Flagge
Tut nichts.
Stern Fernsehen
Startet einen neuen Thread, der an die Variable angehängt ist V
. Der Thread führt den Befehl sofort und in jedem weiteren Zug online aus V
.
Wenn V
bereits ein Thread angehängt ist, ist dieser Befehl ein No-Op. Wenn V
es sich um eine Variable eines Gegners handelt, startet der Gegner einen Thread, der an diese Variable angehängt ist.
Stoppen Sie V
Stoppt den an die Variable angehängten Thread am V
Ende dieser Runde.
Schloss V
Verhindern Sie, dass die Zeile oder Variable V
auf irgendeine Weise verwendet wird, außer durch den aufgerufenen Thread Lock
. Ein nachfolgender Aufruf von Lock
durch denselben Thread wird entsperrt V
. Sperren können nicht für Variablen oder Zeilen des Gegners aufgerufen werden.
Wenn Cond VW
Dies wird getestet Cond
. Wenn die Bedingung erfüllt ist, wird der Thread-Zeiger auf die Zeilennummer verschoben V
, andernfalls auf die Zeilennummer W
. Diese Zeile wird dann sofort ausgeführt.
Conditionals kann sein X=Y
, X<Y
, !X
, oder ?X
:
X=Y
testet, ob zwei Zeilen vom selben Typ und vom selben Bot sind, oder ob zwei Werte gleich groß sind.X<Y
testet, ob der Wert vonX
kleiner als istY
.!X
testet, ob die Variable oder ZeileX
gesperrt ist (gibt true zurück, wenn gesperrt)?X
testet, ob an eine gegebene Variable ein Thread angehängt ist
Zusätzliche Details
Multithreading-Interaktionen
Aktionen des gleichen Typs werden zur gleichen Zeit ausgeführt. Aktionen werden in der folgenden Reihenfolge ausgeführt:
Sperren. Wenn mehrere Threads versuchen, eine Variable zu sperren, schlagen alle fehl. Wenn ein Thread eine Variable entsperrt, während ein anderer versucht, sie zu sperren, bleibt die Variable entsperrt.
Start. Wenn mehrere Threads versuchen, einen Thread für eine Variable zu starten, wird dies als ein einzelner Start gewertet.
Kopieren. Wenn zwei Threads in dieselbe Variable kopiert werden, wird die Variable als zufälliger Wert ausgegeben. Wenn beide in dieselbe Zeile kopieren, funktioniert beides nicht. Wenn ein Thread in dieselbe Variable kopiert, aus der ein anderer Thread kopiert, kopiert der letztere Thread einen zufälligen Wert. Wenn zwei Threads von derselben Variablen kopiert werden, funktionieren beide einwandfrei.
Wenn. Alle Bedingungen werden gleichzeitig getestet, und anschließend werden die Thread-Variablen aktualisiert. Das Ausführen von
If
kann dazu führen, dass eine Aktion mit einer höheren Priorität hinzugefügt wird. Aktionen mit höherer Priorität werden ausgeführt, bevor Sie an der vorbei gehenIf
, während Aktionen mit niedrigerer Priorität nach der ausgeführt werdenIf
.Bewegung. Mehrere Züge auf demselben Bot bewegen den Bot um die Summe aller Züge. Wenn mehrere Bots am selben Ort landen, werden sie an ihren Startplatz zurückgebracht.
Wende. Mehrere Runden auf dem gleichen Bot summieren sich.
Halt. Mehrere Stoppbefehle für dieselbe Variable werden als ein Stopp gezählt.
Andere Details
Ihr erster Thread beginnt mit dem Anhängen an die D
Variable
Die Wiederholung eines If
(mit einer If
auf sich selbst gerichteten Aussage) bewirkt, dass Ihr Bot nichts unternimmt
Wenn ein Thread nach dem Sperren gestoppt wird, werden diese Sperren entsperrt
Aktionen, die eine gesperrte Variable oder Zeile verwenden, bewirken nichts.
Wenn ein Bot kürzer als 24 Zeilen ist, werden die verbleibenden Zeilen mit gefüllt Flag
Wenn Sie einen Schreibvorgang für eine Variable ausführen, die auch an einen Startthread angehängt ist, beginnt der Thread seine Ausführung mit dem neuen Wert, wenn der Thread die folgende Runde beginnt.
Bots werden nach folgendem Muster in eine toroidale Welt gestellt:
B...B...B...
..B...B...B.
B...B...B...
Ich habe einige Beispiel- Bots hinzugefügt , die als Sprachreferenz kommentiert sind.
Die Steuerung befindet sich hier . Ich habe lange daran gearbeitet, aber es hat wahrscheinlich immer noch Fehler. Wenn die Spezifikation und der Controller widersprechen, ist die Spezifikation korrekt.
Anzeigetafel
1. 771 LockedScannerBot
2. 297 CopyAndSelfFlag
3. 289 DoubleTapBot
4. 197 ThreadCutterBot
5. 191 TripleThread
6. 180 ThickShelled
7. 155 Attacker
8. 99 RandomMover
9. 90 BananaBot
10. 56 LockedStationaryDoubleTap
quelle
Antworten:
Gesperrter Scanner-Bot
Scannt den Feind so schnell wie möglich und ersetzt die Linien durch Flaggen.
quelle
DoubleTapBot
Dieser Bot hat 3 Fäden: Einer zum Bewegen (A), die beiden anderen zum Markieren (B und D). B Fahne 1/2 Umdrehung, D Fahne 1/3 Umdrehung. Irgendwann wird er den Gegner doppelt markieren :).
Ich gehe davon aus, dass C auf 0 zurückgeht, wenn es 23 überschreitet.
Es sollte ziemlich sicher sein, wenn es einige Runden hat, um sich vorzubereiten (8 Runden), da er immer mindestens 2 Threads (A & B) normal laufen lässt.
Ich kann es im Moment nicht ausprobieren, also mache ich den Test, wenn ich wieder zu Hause bin :)
quelle
Gesperrte stationäre Doppelklick
Inspiriert von @ Katenkyos DoubleTapBot, gibt dieser ein paar Flaggen und jede Hoffnung auf Bewegung auf, als Gegenleistung dafür, dass er seine eigenen Threads vollständig gesperrt hat, damit er niemals neu programmiert werden kann. Es ist jedoch immer noch möglich, feindliche Flags in nicht schleifenförmige Codebereiche schreiben zu lassen.
quelle
Zufälliger Urheber
Bewegt sich in eine pseudozufällige Richtung
quelle
Dick geschält
Sperrt seine Sachen so gut er kann
quelle
Angreifer Bot
Kopiert Flags an verschiedene Stellen
quelle
Dreifacher Faden
Dieser einfache Bot führt drei Threads mit demselben Code aus. Jeder Faden greift 1/3 Umdrehungen an, bewegt sich 1/6, dreht sich 1/6 und führt 1/3 Buchhaltung durch.
quelle
Bananenbot
Versuche, Bananen in das gegnerische Rad zu werfen, bevor der Feind etwas tun kann. Neigt dazu, zerquetscht zu werden.
quelle
Fadenabschneider Bot
Stoppen Sie alle feindlichen Threads, bevor Sie Ihren Code eingeben.
quelle
Kopieren und selbst kennzeichnen
Dieser Bot führt drei Threads aus. Der D-Faden bewegt sich, bis er auf einen Feind trifft, versucht dann, eine Flagge in ihn zu kopieren, und bewegt sich dann in eine zufällige Richtung. Der A-Thread kopiert sein eigenes Flag über nicht wesentliche Zeilen des Bot-Codes. Der B-Thread ist nur ein Zähler. Die von jedem Thread verwendeten Variablen, Flags und Codezeilen sind in den ersten 15 Runden vollständig gesperrt, und der Bot überschreibt fast den gesamten Startcode mit seinen eigenen Flags. Ich denke nicht, dass es möglich ist, diesen Bot nach Runde 15 in das Banner eines anderen Teams zu konvertieren, ohne dass ein dedizierter Angriffsbot nichts anderes tut, als ihm Flaggen zu schreiben.
quelle
Move 0
ist nach Norden zu bewegen, nicht vorwärts.