Bots de code
Je déteste les variables privées et protégées. Je veux juste accéder à tout et n'importe quoi!
Si vous êtes comme moi, alors ce défi est pour vous!
Ecrivez un bot qui fonctionne bien en harmonie avec d'autres bots pour que les autres fassent ce que vous voulez Vous êtes un programmeur et vous savez comment les choses sont censées fonctionner. Votre travail consiste à convertir autant de bots que vous le souhaitez.
Le code
Vous aurez 24 lignes de code pour écrire votre bot. Chaque tour, chaque bot exécutera 1 ligne de manière séquentielle.
Chaque bot stocke 5 variables à A
travers E
. A
et B
sont à usage personnel, C
stocke la ligne suivante à exécuter, D
stocke la direction actuelle et E
constitue un nombre aléatoire. Les variables commencent à 0, sauf pour D
qui commencera à une valeur aléatoire. Toutes les variables ont uniquement la mémoire 0-23. Les nombres plus grands ou plus petits seront modulés par 24.
Dans ce post, je vais utiliser l'adversaire pour être le bot adjacent auquel vous faites face.
Chaque ligne doit contenir l'une des 5 commandes suivantes:
Flag
ne fait rien. Sauf que c'est comme ça qu'on gagneMove
déplace votre bot dans laD
direction th. Si un bot occupe déjà l'espace, aucun mouvement ne se produiraCopy Var1 Var2
copie le contenu de Var1 dans Var2If Condition Line1 Line2
Si la condition est vraie, exécute Line1, sinon Line2Block Var1
bloque la prochaine écriture sur une variable
Une variable peut être utilisée comme suit:
#Var
utilisera la variable comme numéro de ligne. Si A
is est 17, Copy #8 #A
copiera le contenu de la ligne 8 sur la ligne 17.
*Var
utilisera la variable de votre adversaire. Copy 5 *C
mettra la C
variable de l'adversaire à 5
Var+Var
ajouter les deux variables. Copy D+1 D
fera tourner le bot vers la droite
Quand D
est utilisé comme direction, [North, East, South, West][D%4]
sera utilisé
Ces modificateurs peuvent être chaînés: Copy *#*C #9
ils copieront la ligne suivante que votre adversaire exécutera dans votre propre code, à la ligne 9. **D
fait référence à la D
variable de l'adversaire de votre adversaire .
Une condition sera évaluée comme suit:
- Si
Var
:- Si Var est
A
completC
, il retournera vrai si Var est différent de zéro, sinon faux. - Si Var est
D
, il retournera vrai s'il y a un bot dans laD
direction th, sinon faux - Si Var est
E
, il retournera vrai si E est impair, sinon faux - Si Var est une ligne, il retournera true s'il s'agit d'une ligne de drapeau
- Si Var est
- Si
Var1=Var2
:- Renvoie true si les deux sont
A-E
valables et égalent le même nombre - Renvoie true si les deux sont des lignes et si le type de ligne est égal.
- Renvoie true si les deux sont
- Si
Var1==Var2
:- Renvoie true si les deux sont
A-E
valables et égalent le même nombre - Retourne vrai si les deux sont des lignes et sont identiques (les drapeaux de différents robots ne seront pas égaux)
- Renvoie true si les deux sont
50 robots de chaque type seront placés dans un monde toroïdal de la manière suivante:
B...B...B...B...
..B...B...B...B.
B...B...B...B...
..B...B...B...B.
Après chaque tour de 5 000 tours, les drapeaux de chaque bot seront comptés. Vous obtenez un point si un bot a plus de votre drapeau que tout autre type de drapeau. Si le cas d'égalité entreN
robots, aucun point n'est attribué.
Il y aura 10 matchs et les scores seront accumulés à la fin.
Notes de côté
Les commentaires de fin de ligne sont autorisés et sont signalés par //
Essayer de faire quelque chose qui n'a pas de sens, comme ajouter à une ligne ne fera rien
Essayer de faire quelque chose sur un bot inexistant ne fera rien
Récursion infinie sur un If
testament se termine sans qu'aucune ligne ne soit exécutée
If
ne change pas la valeur de C
UNE Block
n'expire pas jusqu'à ce que quelqu'un tente de lui écrire
Plusieurs variables et lignes peuvent être bloquées en même temps
Block
Une variable multiple bloquera plusieurs fois tant que la seconde instruction de bloc est sur une ligne de code différente de celle de votre première
Les espaces ne sont autorisés qu'entre les arguments (et après la commande)
Si un bot est plus court que 24 lignes, Flag sera le reste des lignes.
Exemple de programme
Copy 2 C //Skip to the If line
Flag //Where I'm storing my flag
Move //Move in the D'th direction
If D #5 #2 //If there's a bot, copy code, otherwise, move!
Copy #1 *#E //Copy my flag onto a random spot in my bot's code
Copy 2 C //Skip back to the If line
Le programme sera exécuté par mon contrôleur Python ici .
Le contrôleur Java est là C'est rapide et a une bien meilleure apparence que celui en python.
Tableau de bord:
- 6837 $ Copie
- 3355 Lockheed
- 1695 MindControl
- 967 byzantine
- 959 AttackOrElse
- 743 cadmyllion
- 367 grippe
- 251 TheCommonCold
- 226 mage
- 137 HideBlockAttack
- 129 RowBot
- 123 FastMoveCloneDodge
- 112 FastForwardClone
- 96 QuickFreeze
- 71 RepairAndProtect
- 96 SuperFreeze
- 93 RovingVirus
- 80 ForwardClone
- 77 FreezeTag
- 68 Palimpseste
- 62 BlockFreezeAttack
- 51 RushAttackDodge
- 46 bloqueur
- 40 Tourellière
- 37 Copycat
- 37 Kamikaze
- 35 FlagInjector
- 33 RandomCopier
- 31 insidieux
- 29 HappyAsAClam
- 25 NanoVirus
- 21 annulation
- 19 Nanoviris
- 17 BoringCopybot
- 16 Movebot
- 14 Flagbot
- 13 neutralisant
- 12 cancer
- 9 DNAbot
- 9 parasites
- 8 MetaInsidious
- 8 Rebranding
- 8 AdaptiveBot
- 8 ReproducingBot
- 8 KungFuBot
- 5 QuickFreezerbot
- 4 attaquant
la source
Réponses:
Flagbot
Pourquoi se donner la peine de faire quoi que ce soit alors que d'autres robots seront assez gentils pour me donner leur code?
la source
Freeze Tag
Attrapez l'adversaire dans une boucle, remplissez-le de drapeaux, passez à l'adversaire suivant.
la source
Copy C+23 C
Ce doit être la ligne de code xD la plus malveillante.Or would that not count as your flags?
. Parce que s'ils ne comptent pas comme vos propres drapeaux, ce n'est certainement pas une bonne solutionParasite
Pourquoi tuer d'autres robots? Ce bot regarde à travers le code de l'adversaire et ne remplace que les drapeaux.
la source
$ Copie
Ce bot utilise une grande partie des mêmes techniques que Lockheed de COTO, je vais donc emprunter et améliorer sans vergogne.
Cela exploite une
C
vulnérabilité pour casser des blocs et même inverser le neutralisant. Il est également écrit en absolus à cause de cela. Je pense que cela pourrait casser si leC
changement est rétabli, mais tant que le changement est constant, il peut être réécrit pour le combattre.Pour une raison quelconque, le manque de boucle à la fin a rendu ce bot super bon.
la source
C
valeurs. Ainsi, un bloc peut être empilé lorsqu'il est appelé à partir d'uneIf
instruction, qui est l'exploit utilisé ici. $ Copy casse des blocs (comme la palourde) en s'exécutantCopy
sur la même ligne encore et encore jusqu'à la réussite, ce qui lui confère un avantage sur Lockheed.Lockheed
Ma troisième (et probablement finale) soumission à cette guerre des botiers: le réacteur de Lockheed, ou "Lockheed" en abrégé.
Un merci tout spécial à @Wasmoo, qui a partagé sa découverte de "" Le blocage d'une variable à plusieurs reprises bloquera plusieurs fois, à condition que la deuxième instruction de blocage se trouve sur une ligne de code différente de la première. " n'est tout simplement pas vrai "exploit. Je m'en sers beaucoup.
Merci également à Nathan Merill d’avoir organisé le concours et publié le simulateur. Le simulateur est extrêmement précieux pour régler les robots. Je n'y aurais pas cru si je ne l'avais pas simulé de mes propres yeux, mais l'ajout ou la suppression de la fonctionnalité de bot la plus mineure sur le plan conceptuel peut faire toute la différence entre un grand succès et un échec cuisant. Je suis déchiré quant à savoir si c'est une bonne chose ou non.
la source
If
pointage sur cette ligne n’échouera pas), vous bloquez la même valeur (une seule ligne peut bloquer les lignes 1 à 24 avec une variable d’incrémentation) et bloc n'a pas encore été publié (quelqu'un a essayé de modifier cette variable)C
,<block target>
) n'est pas déjà en vigueur". C'est-à-dire que la ligne sur laquelle se trouve l'instruction de bloc n'a aucune pertinence pour l'empilement, sauf que si le bloc est exécuté directement,C
= adresse d'instruction de bloc.Attaque ou autre
Voyant que les robots défensifs comme Byzantine se portaient si bien, j'ai décidé de fabriquer également un robot défensif.
Cela a deux séries de modèles, selon que l'ennemi est présent ou non.
il alterne entre la copie de son drapeau et le code de copie qui le poussera à copier ce drapeau (un réplicateur faible),il copie son drapeau.Plus de tests ont montré quelques concepts importants:
A+7
montré est plus efficace que tout autre incrément (+200 par rapport au plus proche)Observer graphiquement la simulation via l'interface utilisateur Java a beaucoup aidé. Merci! Vous trouverez ci-dessous le code nouveau et amélioré. Je ne pense pas pouvoir faire plus.
la source
C
qui l'a bloqué. Parce que ce bot a un bloc tournant basé surC
, il accumulera plusieurs blocs sur chacune de ses commandes. Cela rend ce bot plus défensif.If
ligne à une liste, en saisissant laC
variable qui l'a appelée. Donc, avec les 1 Block et 9 If qui exécutent l'instruction Block, le bot peut obtenir jusqu'à 10 Blocs pour chaque ligne (prenant au moins 24 * 10 * 10 tours). Le PO n'a peut-être pas correctement transmis la simulation.Row Bot
Va se déplacer jusqu'à ce qu'il trouve un robot.
Va mettre ce robot dans la même direction que lui-même.
Copiera ensuite son code dans le robot.
Cela devrait faire une rangée de "Row Bot" Robots. :)
la source
If
déclarations doivent être capitalisées. Deuxièmement, il ne devrait pas y avoir d'espaces de part et d'autre de la=
, commeD=*D
.Super congélation
Ce bot continue d'essayer de geler le bot devant lui jusqu'à ce que cela fonctionne, puis écrit un tas de drapeaux sur des lignes aléatoires, et après 8 tours, il tourne et passe à un autre adversaire.
la source
byzantin
Un bot hautement défensif qui institue de multiples blocs sur ses drapeaux et les instructions les plus sensibles, y compris des méta-blocs (c'est-à-dire des blocs sur des instructions de bloc critiques).
De plus, il se déplace de façon imprévisible et installe des drapeaux dans de nombreux endroits sur des adversaires du mieux possible.
Je ne sais pas comment cela va fonctionner, car je ne peux pas simuler. Mais nous allons tenter le coup. ;)
Avertissement
J'ai écrit ceci avant d'être bien informé par PhiNotPi que la logique conditionnelle est gratuite. Cependant, j'ai décidé de le laisser car on ne peut jamais avoir trop de robots.
la source
Cadmyllion
"Je viens d'entrer dans un bot dans la bataille royale", dis-je. "Il se déplace tous les quelques tours pour empêcher les attaques de bots plus lents."
"Que voulez-vous dire par bots lents?" Demande PhiNotPi.
"Les robots bloqués évaluent de longues chaînes de logique conditionnelle", répond-je.
"Les instructions 'if' qui redirigent vers d'autres instructions, y compris d'autres instructions 'if' - sont toutes exécutées au même tour," déclare PhiNotPi.
"Douces règles massacrées du code d'assemblage!" Je pleure. "Qui a eu cette idée?"
... et c'est ainsi l'histoire de la naissance de Cadmyllion.
Cadmyllion: le bot qui exploite avec bonheur la capacité surréaliste d'évaluer une infinité d'expressions conditionnelles dans une seule instruction ... en rendant pratiquement tout ce qu'il fait est conditionnel.
Code
la source
Meta Insidious
Ce bot se fige et convertit ensuite les adversaires en versions moins efficaces d' Insidious de Sparr , qui à leur tour transformera les adversaires en bots qui spamment des drapeaux pour moi. C'est probablement le bot le plus complexe que j'ai écrit et je m'attends donc à ce qu'il fasse très mal, il n'y avait pas d'espace pour le blocage et un seul drapeau installé dans le code. Transformer un bot en un clone insidieux prend également trop de temps.
Le plus gros défi consistait à écrire le code pour les clones insidieux de manière à ce qu'il fonctionne quelle que soit sa position dans le bot. Le gel est supprimé lorsque je colle l’avant-dernier code exactement à l’endroit où se trouve le gel, cela déclenche l’opposition juste à temps.
la source
Réparer et protéger
Ce bot répare son propre code, tout en protégeant les lignes récemment réparées.
Explication:
La valeur initiale de
A
is0
et les lignes sont numérotées de 0 à 23. Si l'If
instruction est exécutée et qu'elle est fausse, il tente d'exécuter à nouveau la même ligne. Le contrôleur ne permet pas à un bot d'exécuter deux fois la même ligne, le tour est terminé etC
incrémenté1
.La ligne suivante
Copy #A #A+8
est effectivement exécutée quelle que soit la valeur de l'If
instruction. La différence est qu'il est exécuté deux fois si vrai et une fois si faux. Si la ligne#A+8
est bloquée (ce qui se produit éventuellement), le faire deux fois avec une copie réelle, le faire une fois, le débloquera seulement. Ensuite, la ligne nouvellement copiée est bloquée pour la conserver.la source
A
? N'est-ce pas0
? Si c'est le cas, votre première ligne compare la ligne 0 à la ligne 16, mais comme je l'ai compris dans l'exemple du bot OP, la première ligne est la ligne 1, n'est-ce pas? De plus, toujours dans votre première ligne,#C
fait référence à cette ligne même, cela signifie-t-il que si laIf
déclaration renvoie false, vous êtes bloqué dans une boucle sans fin?Neutralisant
Ce bot force sa victime à réécrire tout son programme, lui donnant une valeur de 0 point. Une fois que le virus est en place, il continue. Ceci est une approche de la terre brûlée à la victoire.
La comparaison
*#*C==#7
ne semble pas s'adapter correctement au décalage de l'adversaire, mais le bot finit par passer à autre chose.la source
Copy C+1 C
est tout ce qui est nécessaire pour sauter une seule ligne.Copy 23 C
y aller à la place, pour revenir à la première ligne.Insidieux
Inspiré par @Cruncher, ce bot infecte les autres robots avec un petit bloc de code, remplissant l'autre bot avec les drapeaux de ce bot. Ces bots sont alors des canards assis pour une attaque ultérieure, mais ils seront surtout remplis de mes drapeaux quand ils seront réinfectés par quelqu'un d'autre.
Edit: merci à @PhiNotPi pour son aide au golf, @overactor pour ses conseils en matière d'efficacité
la source
Heureux comme une palourde
Ceci est un exercice de blocage. Il a fonctionné remarquablement bien jusqu'à ce que
$Copy
vienne autour.La palourde a 22 commandes de bloc. Parce que
A
chaque boucle est décalée, ils référenceront des lignes différentes à chaque fois dans la boucle. Cela permet à chaque commande d'empiler des blocs sur une ligne sur deux, avec un maximum de 22 blocs par ligne. Ainsi, pour casser la palourde entièrement blindée, il faudrait écrire 22 fois sur une ligne.Par exemple,
#10
sera protégé chaque fois à travers la boucle par les lignes suivantes:#10
protégé par la ligne 7 (7+0+3
= 10)#10
protégé par la ligne 0 (0+7+3
= 10)#10
protégé par la ligne 17 (17+14+3
= 34 = 10)#10
protégé par la ligne 10 (10+21+3
= 34 = 10)Ainsi, après que la ligne 10 de la boucle 3
#10
ait été bloquée 4 fois , il a fallu 4 écrit#10
pour casser les blocs, avec une 5e pour écraser la ligne.Notez que les blocs sont définis par leur
C
valeur et ne s'empileront pas si la ligne protégée a déjà été bloquée par la mêmeC
valeur. Ainsi, après l’établissement de 22 blocs pour chaque ligne, les blocs ne seront plus empilés.la source
Contrôle de la pensée
Je suppose qu'il n'est jamais trop tard?
MindControl vient de mon idée qu'il faudrait beaucoup de temps pour copier tout mon programme sur l'adversaire, au cours duquel mon bot est vulnérable aux attaques venant d'autres directions. Alors, pourquoi ne pas obliger l'adversaire à copier mon programme pendant que je recherche des ennemis?
Une fois qu'il a trouvé un ennemi, MindControl le bloque immédiatement pour empêcher toute évasion. Ensuite, il télécharge le téléchargeur sur l'adversaire et laisse la victime télécharger le programme de MindControl lui-même. Le téléchargeur exploite le fait que peu de robots utilisent
B
et vont en boucle jusqu'à ce qu'il télécharge les 24 lignes. Quand le téléchargeur réécrit#19
deCopy 16 C
àCopy 23 C
, cela signifie que la victime a téléchargé toutes les lignes et continue à se réinitialiser.Les premières versions de mon bot n'incluent pas les blocs. Et il était si vulnérable que presque tout changement est invalidant. J'ai donc décidé d'ajouter des blocs basés sur $ Copy de Wasmoo (basé sur Lockheed de COTO). L'inconvénient que j'ai trouvé est qu'il est difficile pour l'original de corriger les erreurs dans les copies. Mais ceci est loin d’être invalidant et le score a augmenté de manière significative, j’ai donc gardé les Blocks.
MISES À JOUR
J'ai amélioré le téléchargeur pour continuer à essayer de télécharger jusqu'à ce qu'une réécriture réussisse pour contourner les blocs. Cela signifie qu'il faut encore un tour pour télécharger le téléchargeur, mais mon score a doublé après ce changement! Ne peut pas discuter avec des chiffres.
Une autre mise à jour. Comme vous l'avez peut-être remarqué, MindControl décide d'attaquer une cible en comparant une ligne aléatoire entre elle et sa cible. S'ils concordent, MindControl considère simplement que la cible est déjà infectée et la laisse tranquille. (Remarque: j'avais l'habitude d'utiliser une ligne statique à des fins de comparaison, mais cela donne beaucoup de faux positifs et de faux négatifs) Il s'avère que cela donne beaucoup de faux négatifs. J'ai donc décidé d'exploiter
==
et de faire quelques changements insignifiants commeC+23
à23+C
. Le programme est fonctionnellement identique mais différent aux yeux de==
. Maintenant que MindControl n’a plus de ligne identique à une ligne d’un autre bot, il touchera 100% des bot non modifiés. Encore une fois, le score a augmenté de manière significative.Amélioration du téléchargeur à nouveau. Il fonctionne maintenant sur une boucle plus courte. (qui semble avoir une grande corrélation avec mon score)
Downloader amélioré encore une fois. Utilise le code du bot original pour un téléchargement plus rapide. Également ajouté 2 blocs aléatoires qui semblent améliorer le score
la source
Attaquant
la source
Movebot
Comme Flagbot, mais déplacez-vous tout en acceptant des cadeaux de code assortis à tous nos drapeaux.
la source
Robot reproducteur
Ce bot tente de geler son adversaire, puis de copier l'intégralité de son code dans ce bot avant de redémarrer l'autre. Cela devrait également fonctionner (surtout) si l'adversaire utilise le blocage, bien que cela ralentisse encore le processus.
la source
Mage
Magus est une simple tentative de virus auto-propagateur. Il tente de se copier dans les programmes d'autres robots. (Modifié pour supprimer les nombres négatifs, corriger la condition, couper les lignes.)
la source
for (int i = 1; i < 25; i++)
.. .DNAbot
Ce bot répare son propre code tout en se déplaçant et en attaquant.
la source
Bloqueur
la source
Imitateur
la source
Congélateur rapide
Essaie de copier les drapeaux dans la ligne qui sera exécuté à côté de son adversaire, se déplace s'il n'y a pas d'ennemi à attaquer.
la source
Bloquer, geler, attaquer
Bloque les 24 lignes, puis boucle 24 fois en mouvement ou en attaque, puis se répète. Une attaque consiste à tenter de geler l'adversaire, puis à copier quatre drapeaux à des emplacements aléatoires, puis à les tourner.
la source
Masquer, bloquer, attaquer
Ce bot est basé sur Block Freeze Attack. J'ai modifié l'emplacement de certaines
If
instructions pour les rendre plus compactes, ce qui m'a permis de planter plus de drapeaux. Je l’ai aussi fait fuir au début d’un jeu pour gagner du temps pour le bloquer.la source
Virus errant
Ce bot se promène jusqu'à ce qu'il trouve un ennemi, puis le bloque, remplace tout son code par le sien, le débloque puis recommence.
la source
Le rhume
Il vous infecte presque immédiatement et vous allez le répandre. Basé sur le parasite de PhiNotPi, le test à froid classique vérifie presque immédiatement s’il peut copier son drapeau sur le vôtre. Bloque une valeur aléatoire s'il ne le peut pas. Se déplace un peu s'il n'y a pas d'adversaire.
la source
Grippe
Ceci est étroitement basé sur le rhume (qui était basé sur mon parasite) avec une vitesse légèrement accrue.
la source
Rebranding
This bot tries to randomly locate flags in enemy bots and replace them with friendly flags, turning away after detecting success. Inspired by Cancer bot.
la source