sheesh, est-ce vraiment le 4? Pour tous les anciens, le défi principal est le même, mais nous utilisons Java au lieu d'un langage personnalisé. Voici les trois derniers défis CodeBot , au cas où vous seriez intéressé.
Le but de CodeBots est de rendre votre bot aussi viral que possible . Chaque bot porte un drapeau, et vous devez vous assurer que votre drapeau est partout .
API
Les bots suivront un "protocole" normalisé, et les bots progresseront de manière synchrone:
IPAddress selectMessageRecipient()
permet à un bot de choisir à qui il veut envoyer un message "amical".Message sendMessage()
permet à un bot de choisir le contenu du message qu'il enverra.processMessage(IPAddress, Message)
est appelé pour chaque message reçu par un bot.FunctionType selectFunctionToBlock()
empêche une fonction d'être écrasée pour le tour en cours. Voir l'étape 7.IPAddress selectAttackTarget()
permet à un bot de choisir qui il veut DDOS. Une attaque DDOS réussit si le bot est ciblé par 3 bots en même temps. Si une attaque réussit, chacun des attaquants peut effectuer les étapes 6 et 7.readData(ReadonlyBot)
permet à un bot de lire les données stockées sur le bot vulnérable.FunctionType selectFunctionToReplace()
est le nœud de ce défi . Vous êtes autorisé à sélectionner 1 fonction (parmi les 8 répertoriées ici) pour copier de votre bot vers son bot. Ensuite, votre fonction sera appelée à la place de la leur . Si plusieurs bots sélectionnent la même fonction, une aléatoire sera réussie.String getFlag()
est appelé à la fin du jeu et doit renvoyer une chaîne unique à votre soumission. Votre fonction doit toujours renvoyer la même chaîne. La soumission avec le plus de drapeaux à la fin du jeu gagne.
Espace de rangement
Vous avez 3 formes de stockage, un carnet d' adresses , un journal et des variables . Ces formes de stockage sont locales au bot sur lequel votre fonction est exécutée (donc si votre fonction est copiée, le contenu de chacun de ces objets sera différent). Tous ces objets peuvent être modifiés ou effacés manuellement. Pour obtenir ces objets, vous avez un getter dans votre classe (par exemple getLog()
).
Le Carnet d' adresses stocke une liste de IPAddress , chacun avec un AddressType , ce qui vous permet de classer les différents types d'adresses. Le carnet d'adresses contiendra toujours au moins 1 adresse (si elle est effacée, une adresse aléatoire sera ajoutée). Effacement de votre Carnet d' adresses pour obtenir plusieurs IPAddresses n'est pas autorisé.
Le journal stocke une liste de toutes les actions entreprises, ainsi que des données sur l'action. Il comprend également un historique de toutes les attaques réussies (bien que vous ne sachiez pas quelles fonctions elles ont écrasées)
L' objet Variables vous permet de stocker des variables de chaîne attachées à un nom de chaîne. Au début du jeu, les variables contiendront une seule variable, ID
qui contient un ID généré de manière aléatoire qui est unique à votre type de bot.
Vous disposez également d'autres fonctions d'accès:
int getTurnNumber()
renvoie un entier avec le tour en coursbool functionsMatch(ReadonlyBot, FunctionType)
des tests pour voir si la fonction de ReadonlyBot correspond à la vôtreIPAddress personalAddress()
renvoie votre adresse IP
Comment mettre en œuvre
- Vous pouvez obtenir le code de Github
- Ajoutez votre bot au
\bots
dossier, puis ajoutez une référence à votre bot danscontroller\CodeBotFactory.java
- Votre bot doit étendre
codebots.bot.CodeBot
oucodebots.bots.DefaultCodeBot
- Vous avez besoin de Java 8 si vous souhaitez exécuter le contrôleur.
- Vous pouvez exécuter le code (en supposant que vous êtes dans le
/src
dossier) en utilisantjavac codebots\*.java
pour compiler, puisjava codebots.Main
pour exécuter. - Vous ne pouvez pas avoir de variables membres non constantes dans votre classe
- La réflexion n'est pas autorisée.
- Les formes de communication entre les robots (du même type ou de types différents) en dehors des méthodes énumérées ci-dessus ne sont pas autorisées.
- Les bots stupides et / ou suicidaires sont autorisés, mais tous les bots doivent être fonctionnellement différents des entrées existantes.
- Si vous voulez du hasard dans votre bot, utilisez
getRandom()
- Veuillez essayer de garder votre code efficace. J'ai passé beaucoup de temps à profiler et à rendre le contrôleur rapide.
Les scores
105.2501 Expelliarmus!
104.5803 J'aide!
104.2746 Qui suis-je?
103.8529 Dumb Bot
103.2028 Replacer
102.7045 Chaos
102.4046 Hermit Bot
102.2849 Swarmer
100.5598 Le robot aléatoire vous aime
99.966 Trust in Trust!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 Juste votre sympathique robot de livraison de courrier de quartier.
89.4645 null
la source
Réponses:
TrustBot
Si vous lui envoyez un message, il fera ce qu'il dit. S'il lit un bot, il copiera les adresses directement dans son livre. Il attaque les robots que le carnet d'adresses dit d'attaquer.
la source
AmnesiaBot
Un bot aléatoire qui injecte à d'autres bots du code de perte de mémoire. Chaque fonction commence par un code pour effacer le journal, le carnet d'adresses et les variables. Ce code entraînera la perte de mémoire des robots intelligents, afin de supprimer la logique.
la source
NullBot
Son drapeau est très ... caractéristique ...
Ceci est également destiné à tester le contrôleur et les limites de la règle «les bots stupides sont autorisés».
la source
null
est une chaîne. ;) Juste une chaîne de fantaisie.RandomCodeBot
Entrée KoTH aléatoire obligatoire
la source
DisarmerBot
DisarmerBot n'est pas trop intelligent. S'il reçoit des instructions d'attaque, il choisira un attaquant aléatoire, sinon, il attaquera un joueur aléatoire. Il remplace simplement leur
selectFunctionToBlock
fonction de blocageselectFunctionToBlock
.la source
MarkedBot
Se marque au premier tour et utilise ces informations dans les tours suivants. De cette façon, si un autre bot est injecté avec son code d'attaque, il sera inefficace.
la source
SwarmBot
Ce bot mal nommé est plutôt compliqué (et le plus compliqué soumis jusqu'à présent), mais j'ai fait une tentative de bot qui remplace systématiquement toutes les méthodes d'une cible avant de passer à une nouvelle cible. Il tente d'identifier des copies de lui-même et de les traiter comme des alliés, en les vérifiant périodiquement pour assurer l'intégrité. Je n'ai pas trouvé de meilleur nom.
Lien vers la branche repo de github, car ce bot mesure 340 lignes.
https://github.com/Draco18s/CodeBots4/blob/master/src/codebots/bots/SwarmBot.java
Quelques points intéressants:
Variables
activé et incrémente à chaque tour. Cela devrait suivre la règle «pas de variables non constantes».functionsMatch
méthode . SansfunctionsMatch
cela, il était impossible d'écrire un bot capable de prendre des décisions significatives, car il était aveugle. Il pourrait lire ses variables et journaux cibles, mais ne sait rien de l'état de sa cible.Il y a probablement encore quelques améliorations possibles, mais je ne les vois pas. Les lignes 198-205 sont probablement un porc de performance, mais jusqu'à ce que la classe IPAddress permette de reconstituer les adresses à partir du stockage dans les variables, cela est nécessaire (car les bots n'ont aucun moyen de valider une adresse, tout stockage d'une adresse non valide entraîne le jeu pour envelopper une cible nulle dans un ReadOnlyBot, en lançant NPE).
Edit: Mises à jour 12/12/15
Ajuster certains des paramètres du
getTurnNumber()
logique a permis quelques améliorations des performances. L'augmentation de 5% à 10% du ciblage en fin de partie valait environ 15 points, augmentant également le ciblage en début de partie de 5% à 8%. Combiné, ce bot peut maintenant (presque) survivre même face à AmnesiaaBot (atteignant le 2e avec un score de 110, où HelperBot atteint environ 117).Même avec ces ajustements, il peut ne pas avoir de chance, donc pour 10 tours, sa plage de score est d'environ 170-185.
la source
new IPAddress
appel aurait dû être une "recherche dans le carnet d'adresses" comme je l'avais fait dansreadData
. J'ai extrait cette recherche et fixé la ligne 143.DefaultCodeBot
Essaie de faire des choses raisonnables. (Remplacez cette classe si vous ne voulez pas implémenter toutes les fonctions)
la source
HelperBot
Le robot d'assistance ne fait rien d'autre qu'essayer de déployer son propre drapeau ... ou du moins le drapeau qu'il porte actuellement ...
Si HelperBot suppose que toute méthode qui est écrasée (autre que
getFlag()
) sera remplacée par quelque chose de mieux.la source
le chaos
Il libère tous les drapeaux de la tyrannie du blocage.
la source
Replacer
Cette entrée remplace toutes les
selectFunctionToReplace
fonctions par sa propreselectFunctionToReplace
fonction.la source
MailBot
Mailbot ne gère que les messages. Il ne parvient pas à faire sortir son propre drapeau dans le monde (score moyen ~ 50, légèrement supérieur à nullbot à ~ 45), mais envoyez-lui un message et il transmettra votre adresse à quelqu'un d'autre.
J'ai envisagé de sauvegarder les détails afin de transmettre tout le message à un nouveau bot (contenu et indicateur) plutôt qu'à l'adresse IP de l'expéditeur, mais cela aurait impliqué une utilisation intensive des variables sans aucun gain fonctionnel, en particulier si AmnesiaBot était en jeu.
la source
DumbBot
Ugh, cela semble sale. C'est probablement la seule chose qui bat AmnesiaBot. En réalité, c'est juste un RandomBot spécialisé: il obtient un bot aléatoire dans la simulation (via
getAddressBook().clear()
) et remplace aléatoirement la fonction Block ou la fonction Flag. C'est ça. En ne choisissant que ces deux-là, son taux de propagation du drapeau est plus élevé que AmnesiaBot ou HelperBot, mais seulement légèrement après 3000 tours:J'ai un peu tripoté la fonction de remplacement, mais au final, c'est la version qui a eu le plus de succès.
la source
Ermite Bot
Il vit seul et ne parle qu'à lui-même. Si moins de gens savent qui il est, il sera moins gêné. Si quelqu'un le dérange, il les attaquera jusqu'à ce que quelqu'un le dérange.
la source