Meine Güte, ist das wirklich der 4.? Für alle alten Leute ist die Kernherausforderung dieselbe, aber wir verwenden Java anstelle einer benutzerdefinierten Sprache. Hier sind die letzten drei CodeBot- Herausforderungen , falls Sie interessiert sind.
Das Ziel von CodeBots ist es, Ihren Bot so viral wie möglich zu machen . Jeder Bot trägt eine Flagge, und Sie müssen sicherstellen, dass Ihre Flagge überall ist .
API
Die Bots folgen einem standardisierten "Protokoll" und durchlaufen synchron die folgenden Schritte:
IPAddress selectMessageRecipient()
Ermöglicht einem Bot zu wählen, an wen er eine "freundliche" Nachricht senden möchte.Message sendMessage()
Ermöglicht einem Bot, den Inhalt der Nachricht auszuwählen, die er senden wird.processMessage(IPAddress, Message)
wird für jede Nachricht aufgerufen, die ein Bot empfängt.FunctionType selectFunctionToBlock()
Verhindert, dass eine Funktion für die aktuelle Runde überschrieben wird. Siehe Schritt 7.IPAddress selectAttackTarget()
Ermöglicht einem Bot zu wählen, wen er zu DDOS möchte. Ein DDOS-Angriff ist erfolgreich, wenn der Bot von 3 Bots gleichzeitig angegriffen wird. Wenn ein Angriff erfolgreich ist, kann jeder Angreifer die Schritte 6 und 7 ausführen.readData(ReadonlyBot)
Ermöglicht einem Bot das Lesen von Daten, die auf dem anfälligen Bot gespeichert sind.FunctionType selectFunctionToReplace()
ist der Kern dieser Herausforderung . Sie dürfen 1 Funktion (von den 8 hier aufgelisteten) auswählen, um von Ihrem Bot auf ihren Bot zu kopieren. Dann wird Ihre Funktion anstelle ihrer aufgerufen . Wenn mehrere Bots dieselbe Funktion auswählen, ist eine zufällige erfolgreich.String getFlag()
wird am Ende des Spiels aufgerufen und sollte eine eindeutige Zeichenfolge für Ihre Eingabe zurückgeben. Ihre Funktion sollte immer dieselbe Zeichenfolge zurückgeben. Die Einreichung mit den meisten Flaggen am Ende des Spiels gewinnt.
Lager
Sie haben drei Arten des Speichers: ein Adressbuch , ein Protokoll und eine Variable . Diese Speicherformen sind lokal für den Bot, auf dem Ihre Funktion ausgeführt wird (wenn Ihre Funktion kopiert wird, ist der Inhalt jedes dieser Objekte unterschiedlich). Alle diese Objekte können manuell geändert oder gelöscht werden. Um diese Objekte zu erhalten, haben Sie einen Getter in Ihrer Klasse (zB getLog()
).
Das Adressbuch speichert eine Liste von IP-Adressen mit jeweils einem Adresstyp , mit dem Sie die verschiedenen Adresstypen klassifizieren können. Das Adressbuch enthält immer mindestens 1 Adresse (wenn es gelöscht ist, wird eine zufällige Adresse hinzugefügt). Das Löschen Ihres Adressbuchs zum Abrufen mehrerer IP-Adressen ist nicht zulässig.
Das Protokoll speichert eine Liste aller durchgeführten Aktionen sowie Daten zur Aktion. Es enthält auch einen Verlauf aller erfolgreichen Angriffe (obwohl Sie nicht wissen, welche Funktionen sie überschrieben haben).
Mit dem Variablenobjekt können Sie Zeichenfolgenvariablen speichern, die an einen Zeichenfolgennamen angehängt sind. Beim Spielstart enthalten Variablen eine einzelne Variable, ID
die eine zufällig generierte ID enthält, die für Ihren Bot-Typ eindeutig ist.
Sie haben auch andere Zugriffsfunktionen:
int getTurnNumber()
Gibt eine Ganzzahl mit der aktuellen Runde zurückbool functionsMatch(ReadonlyBot, FunctionType)
Überprüft, ob die ReadonlyBot-Funktion mit Ihrer übereinstimmtIPAddress personalAddress()
gibt Ihre IPAdresse zurück
Wie implementieren
- Den Code erhalten Sie von Github
- Fügen Sie Ihren Bot dem
\bots
Ordner hinzu und fügen Sie dann einen Verweis auf Ihren Bot in hinzucontroller\CodeBotFactory.java
- Ihr Bot muss
codebots.bot.CodeBot
oder verlängerncodebots.bots.DefaultCodeBot
- Sie benötigen Java 8, wenn Sie den Controller ausführen möchten.
- Sie können den Code ausführen (vorausgesetzt, Sie befinden sich im
/src
Ordner), indem Siejavac codebots\*.java
compilieren und dannjava codebots.Main
ausführen. - Sie können nicht haben kein nicht-ständiges Mitglied Variablen in der Klasse
- Reflexion ist nicht erlaubt.
- Formen der Kommunikation zwischen Bots (gleichen oder unterschiedlichen Typs) außerhalb der oben aufgeführten Methoden sind nicht zulässig.
- Dumme und / oder Selbstmord-Bots sind erlaubt, aber alle Bots sollten sich funktional von den vorhandenen Einträgen unterscheiden.
- Wenn Sie Zufälligkeit in Ihrem Bot wollen, verwenden Sie
getRandom()
- Bitte versuchen Sie, Ihren Code effizient zu halten. Ich habe viel Zeit damit verbracht, Profile zu erstellen und den Controller schnell zu machen.
Scores
105.2501 Expelliarmus!
104.5803 Ich helfe!
104.2746 Wer bin ich?
103.8529 Dumb Bot
103.2028 Replacer
102.7045 Chaos
102.4046 Hermit Bot
102.2849 Swarmer
100.5598 Zufälliger Bot liebt dich
99.966 Vertrauen in Vertrauen!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 Nur Ihr freundlicher Roboter für die Zustellung von Nachbarschaftspost.
89.4645 null
quelle
Antworten:
TrustBot
Wenn Sie ihm eine Nachricht senden, wird er tun, was es sagt. Wenn er einen Bot liest, kopiert er die Adressen direkt in sein Buch. Er greift die Bots an, die laut Adressbuch angreifen sollen.
quelle
AmnesiaBot
Ein zufälliger Bot, der anderen Bots Memory Loss Code injiziert. Jede Funktion beginnt mit einem Code zum Löschen des Protokolls, des Adressbuchs und der Variablen. Durch diesen Code verlieren intelligente Bots Speicher, um die Logik zu umgehen.
quelle
NullBot
Seine Flagge ist sehr ... charakteristisch ...
Dies soll auch den Controller testen und die Grenzen der Regel "Dumme Bots sind erlaubt" festlegen.
quelle
null
ist eine Zeichenfolge. ;) Nur eine schicke Saite.RandomCodeBot
Obligatorischer zufälliger KoTH-Eintrag
quelle
DisarmerBot
DisarmerBot ist nicht zu intelligent. Wenn er Angriffsanweisungen erhält, wählt er einen zufälligen Angreifer aus, ansonsten greift er einen zufälligen Spieler an. Es überschreibt nur ihre
selectFunctionToBlock
Funktion zu blockierenselectFunctionToBlock
.quelle
MarkedBot
Markiert sich in der ersten Runde und verwendet diese Informationen in späteren Runden. Auf diese Weise wird ein anderer Bot wirkungslos, wenn er seinen Angriffscode erhält.
quelle
SwarmBot
Dieser nicht gut benannte Bot ist ziemlich kompliziert (und der komplizierteste, der bisher eingereicht wurde), aber ich habe versucht, einen Bot zu finden, der systematisch alle Methoden eines Ziels ersetzt, bevor ich zu einem neuen Ziel übergehe. Es versucht, Kopien von sich selbst zu identifizieren und sie als Verbündete zu behandeln, indem es sie regelmäßig überprüft, um die Integrität zu gewährleisten. Ich habe mir keinen besseren Namen ausgedacht.
Verknüpfung mit dem Github-Repo-Zweig, da dieser Bot 340 Zeilen lang ist.
https://github.com/Draco18s/CodeBots4/blob/master/src/codebots/bots/SwarmBot.java
Einige interessante Punkte:
Variables
aktiviert ist, und erhöht jede Runde. Dies sollte der Regel "keine nicht konstanten Variablen" folgen.functionsMatch
Methode möglich. OhnefunctionsMatch
es war unmöglich, einen Bot zu schreiben, der sinnvolle Entscheidungen treffen konnte, da er blind war. Es konnte seine Zielvariablen und -protokolle lesen, wusste aber nichts über den Status seines Ziels.Es sind wahrscheinlich noch einige Verbesserungen möglich, aber ich kann sie nicht sehen. Die Zeilen 198-205 sind wahrscheinlich ein Leistungsproblem, aber bis die IPAddress-Klasse die Wiederherstellung von Adressen aus dem Speichern in Variablen zulässt, ist dies erforderlich (da Bots keine Möglichkeit haben, eine Adresse zu validieren, führt das Speichern einer ungültigen Adresse zum Spiel Wrap ein Null-Ziel in einen ReadOnlyBot (wirft NPE aus).
Bearbeiten: Updates 12.12.15
Das Optimieren einiger Parameter in der
getTurnNumber()
Logik ermöglichte einige Leistungssteigerungen. Der Anstieg des Endspiel-Targetings von 5% auf 10% war ungefähr 15 Punkte wert und erhöhte das Frühspiel-Targeting von 5% auf 8%. Kombiniert kann dieser Bot jetzt (fast) überleben, selbst wenn er mit AmnesiaaBot konfrontiert wird (er erreicht den 2. Platz mit einer Punktzahl von 110, wo HelperBot ungefähr 117 erreicht).Selbst mit diesen Optimierungen kann es unglücklich werden. Für 10 Runden beträgt die Punktezahl ungefähr 170-185.
quelle
new IPAddress
Anruf sollte ein "Nachschlagen vom Adressbuch" sein, wie ich es in getan hattereadData
. Ich extrahierte diese Suche und die feste Linie 143.DefaultCodeBot
Versucht vernünftige Dinge zu tun. (Überschreiben Sie diese Klasse, wenn Sie nicht alle Funktionen implementieren möchten.)
quelle
HelperBot
Der Hilfsbot versucht nur, seine eigene Flagge zu verbreiten ... oder zumindest die Flagge, die er gerade trägt ...
Wenn HelperBot davon ausgeht, dass jede eigene Methode, die überschrieben wird (außer
getFlag()
), mit etwas Besserem überschrieben wird.quelle
Chaos
Er befreit alle Flaggen von der Tyrannei des Blockierens.
quelle
Ersatz
Dieser Eintrag ersetzt alle
selectFunctionToReplace
Funktionen durch einen eigenenselectFunctionToReplace
Funktion.quelle
MailBot
Mailbot verarbeitet nur Nachrichten. Es ist nicht erfolgreich, eine eigene Flagge in die Welt zu bringen (durchschnittliche Punktzahl ~ 50, geringfügig höher als nullbot bei ~ 45), aber senden Sie eine Nachricht, und Ihre Adresse wird an eine andere Person weitergeleitet.
Ich überlegte, Details zu speichern, um die gesamte Nachricht an einen neuen Bot (Inhalt und Flag) weiterzuleiten , anstatt nur die IP des Absenders, aber das hätte eine starke Verwendung von Variablen ohne funktionellen Gewinn zur Folge gehabt, insbesondere wenn man bedenkt, dass AmnesiaBot im Spiel ist.
quelle
DumbBot
Ugh, das fühlt sich schmutzig an. Dies ist wahrscheinlich das einzige, was AmnesiaBot schlägt. In Wirklichkeit ist es nur ein spezieller RandomBot: Er erhält einen zufälligen Bot in der Simulation (via
getAddressBook().clear()
) und ersetzt zufällig entweder die Block-Funktion oder die Flag-Funktion. Das ist es. Wenn Sie nur diese beiden auswählen, ist die Flaggenausbreitungsrate höher als bei AmnesiaBot oder HelperBot, jedoch nur geringfügig nach 3000 Runden:Ich habe ein bisschen an der Ersetzungsfunktion herumgespielt, aber am Ende war dies die Version, die am erfolgreichsten war.
quelle
Einsiedler Bot
Er lebt alleine und redet nur mit sich. Wenn weniger Menschen wissen, wer er ist, wird er weniger gestört. Wenn ihn jemand stört, greift er ihn an, bis ihn jemand anderes stört.
quelle