Bienvenue dans Code Bots 2!
Vous avez appris votre leçon depuis les derniers codes bots. Vous avez essayé de trouver plus de façons d'adapter plus d'actions en moins de lignes, et maintenant vous l'avez enfin. Vous allez créer un code Bot piloté par les événements.
Votre bot doit comprendre 24 lignes. Chaque ligne suit l'un des deux formats:
Condition:Action
ou
Action
Votre bot a également suffisamment de stockage pour stocker 5 entiers nommés A
par le biais E
. Un entier peut stocker des valeurs de 0 à 23.
Chaque tour, vous exécuterez la ligne C
, sauf si l' une des conditions est vraie. Si c'est le cas, alors C
contiendra alors le numéro de ligne du conditionnel qui est vrai, puis cette ligne sera exécutée. A la fin de chaque tour, C
sera incrémenté.
Il y a les conditions disponibles:
Start
n'est vrai qu'au premier tour. Vous devez avoir ceci dans votre code exactement une foisBotAt(N)
est vrai s'il y a un bot à l'emplacement défini par NEquals(A,B)
est vrai si A est égal à B. Ils peuvent être de types différents, si c'est le cas, ils ne seront pas égaux.Modified(A)
est vrai si aA
été copié lors du dernier tour.A
doit être un nom de variable, une ligne ou une conditionAny(C1,C2,...)
est vrai si l'une des conditions est vraieNone(C1,C2,...)
est vrai si aucune des conditions n'est vraieAll(C1,C2,...)
est vrai si toutes les conditions sont rempliesNot(C)
est vrai si C est faux.C
doit être une condition.
Les variables peuvent être dans l'un des formats suivants. Les 9 premiers sont numériques et peuvent être utilisés chaque fois que N est utilisé dans cette page.
A
,B
,C
,D
,E
- Un nombre de 0 à 23
This
renverra le numéro de ligne sur lequel il se trouve actuellementAdd(N1,N2,...)
renverra la somme de toutes les valeursSub(N1,N2)
renverra N1 moins N2Mult(N1,N2,...)
renverra le produit de toutes les valeursDiv(N1,N2)
renverra N1 divisé par N2Mod(N1,N2)
renverra N1 mod N2OVar(N)
acceptera un nom de variable et renverra la variable de l'adversaireLine(N)
renverra la Nième ligne dans votre codeType(N)
renverra le Nième type de ligne dans votre code (les types sont les noms des actions)Cond(N)
retournera l'état sur la Nième ligneCondType(N)
renverra le type de condition sur la Nième ligne (les types sont les noms des conditions)OLine(N)
renverra la Nième ligne dans le code de votre adversaireOType(N)
renverra le Nième type de ligne dans le code de votre adversaireOCond(N)
retournera la condition sur la Nième ligneOCondType(N)
renverra le type de condition sur la Nième ligne
A
et B
sont pour votre usage personnel, C
est utilisé pour déterminer la ligne à exécuter dans votre code et D
est utilisé comme une direction. Chaque valeur de fait D
référence à une paire de carrés et de directions différente. E
produit une valeur aléatoire à chaque fois. D
et E
sera initialisé à une valeur aléatoire, sinon 0
.
La direction utilisée sera [North,East,South,West][D%4]
. Votre adversaire est le bot du carré immédiat dans cette direction.
4 actions s'offrent à vous:
Move
vous fera avancer d'un carré dans laD
direction e. S'il y a un bot là-bas, vous ne bougerez pas.Copy(A,B)
copiera la variableA
dansB
.B
ne peut pas être une valeur numérique, à l'exception d'un nom de variable.A
etB
ne peut pas être de types différents. La copie d'une ligne ne copie pas la condition.Flag
ne fait rien. Le bot avec le plus de drapeaux dans votre code obtiendra un point. Le bot avec le plus de points gagne.If(C,L1,L2)
exécutera la ligneL1
siC
est vrai, sinon exécuteL2
.C
est une conditionL1
etL2
doit être des lignes.
La grande image
50 exemplaires de chaque bot seront placés dans le monde. Votre objectif est de placer votre drapeau dans autant de robots que possible. Pour chaque bot qui a plus de votre type de drapeau que tout autre type de drapeau, vous obtenez un point.
Les bots seront placés comme suit:
B...B...B...B...
..B...B...B...B.
B...B...B...B...
Il y aura 10 matchs et les points seront calculés en moyenne pour tous les matchs, déterminant ainsi le vainqueur.
Notes annexes
Si plusieurs conditions s'appliquent, alors celle qui suit le plus immédiatement Start
sera exécutée
Les bots seront serrés mais vous ne commencerez pas à voisiner un autre bot. (Ce sera techniquement le même format que les derniers CodeBots)
Comme ce défi n'a pas été affiché dans le bac à sable (pour donner à personne un avantage), je me réserve le droit de modifier les petits détails pour des raisons d'équité ou des capacités supplémentaires. De plus, s'il y a un bug dans le runner CodeBots, je le changerai, même si un bot dépendait de ce bug pour son succès. J'essaie d'être aussi juste que possible.
Les If
instructions récursives ne seront pas exécutées
Si votre bot fait moins de 24 lignes, les lignes restantes seront remplies de Flag
N'oubliez pas que lorsque vous copiez le vôtre C
, cela C
est incrémenté à la fin de votre tour.
L'interpréteur CodeBots peut être trouvé ici . Il comprend un fichier .jar pour une exécution facile. Ajoutez simplement votre bot au dossier des bots
Les scores
- 893,9 Borg
- 1.3 LazyLioness
- 0.9 Défenseur
- 0,5 Flagger
- 0.4 CliqueBot
- 0.4 Insidieux
- 0.3 Attaquant
- 0,3 Gard
- 0.3 SingleTarget
- 0.2 FreezeBot
- 0,2 Sentinelle
- 0.2 Driveby
- 0.0 Anti-insidieux
- 0.0 MoveBot
- 0.0 CliqueBorg
- 0.0 Calculatrice
- 0.0 TestBot
- 0,0 Imitateur
METTRE À JOUR
Les lignes de code sont désormais tournées lorsque vous affichez le code de votre adversaire. Cela signifie que la ligne 1 de votre adversaire peut être la ligne 14 (ou n'importe quelle ligne). Un bot aura un décalage fixe qui compensera ses lignes en X
montant lorsqu'il sera vu par un adversaire . La C
variable de l'adversaire sera également compensée du même X
montant. X
ne changera pas dans le même jeu, mais il changera d'un jeu à l'autre.
la source
Réponses:
Borg
Convertit tous les autres robots en clones de lui-même. La résistance est futile.
Edit: petite correction pour réinitialiser A si l'adversaire bouge avant que j'en ai fini avec lui. Ça ne semble pas affecter le score mais ça me fait me sentir mieux.
Edit # 2: Ajout d'une vérification plus complète pour s'assurer que le processus de clonage s'est correctement terminé (ligne 3)
Édition n ° 3: mise à jour pour gérer les nouveaux décalages aléatoires. La difficulté ici était que les nouveaux clones auraient leur code situé à des décalages aléatoires, ce qui signifie qu'ils ne connaissent pas l'emplacement de leurs propres lignes. Cela signifie que toutes les références à mes propres lignes doivent être relatives (à
This
). Les numéros de ligne opposés peuvent toujours être absolus car ils sont de toute façon aléatoires.la source
Flagger
Viser la lune
Et le reste est automatiquement rempli de drapeau.
la source
Calculatrice
Ce bot ne comprend pas le but de ce défi, il a donc décidé de calculer quelques chiffres pour l'ennemi.
la source
OVar(D)
nonA
!CliqueBot
Reconnaît les amis via leur
B
valeur, remplit les lignes de tous les autres avec des drapeaux. Va également un peu de temps pour préserver l'intégrité de l'un de ses propres drapeaux (cette partie est mignonne mais probablement pas très utile).Edit: Sans surprise, il semble y avoir un bug ici quelque part, à en juger par le score.Je soupçonne que les lignes sont indexées 0 et mon code est indexé 1. J'aurais vraiment dû vérifier cela plus tôt. Ajout d'un drapeau au début pour tout remonter.
la source
Défenseur
la source
MoveBot
la source
Copy(23,C)
?Attaquant
la source
BotAt(D):Copy(Line(X),OLine(E))
où la ligne X contientEquals(1,1):Flag
... pour le plaisirLine
copie uniquement l'action, pas la condition.Seule cible
Vous traquera et vous remplira de drapeaux!
la source
All
condition a besoin d'un)
Insidieux
Idée similaire au bot du même nom lors du concours précédent. Déplacez-vous jusqu'à ce que j'atteigne un autre bot, puis figez-le dans une boucle en écrasant son propre code avec mes drapeaux. Cette fois, les bots infectés écrasent des lignes aléatoires au lieu de lignes séquentielles, ce qui rend le processus d'infection un peu moins efficace mais beaucoup plus rapide.
la source
Line(4)
peut être un peu simplifié.Add(OVar(C),0)
est le même queOVar(C)
etAdd(This,Add(4,Mod(E,14)))
est le même queAdd(This,4,Mod(E,14))
.Gard
Attaque n'importe quel robot à côté.
la source
OCon
doit êtreOCond
Freeze Bot
Vous piège dans une boucle Incriminant votre propre
A
variable, puis vous remplit de drapeaux et passe à la prochaine victime.la source
Imitateur
Prédit ce que vous feriez, puis le fait.
la source
OLine
ou unLine
Line
contourner2
, etAdd(D,1)
au lieu deD+1
Lionne paresseuse
À l'origine juste "Lionne", ma première soumission au concours a valu le titre de "paresseux" en ne faisant littéralement rien lors de son introduction dans le simulateur.
Sa léthargie est en fait due à un bug (ou peut-être à ma mauvaise compréhension du modèle d'événement) dans lequel les conditions dans les trois premières lignes (un simple contrôle de parité pour s'assurer que les drapeaux ne sont pas écrasés) évaluent occasionnellement, inexplicablement
true
, verrouillant leo dans une boucle lemniscate . Plusieurs autres conditions (en particulier celles qui dépendent de laBotAt()
condition) évaluent égalementtrue
à des moments où aucun bot adjacent n'est présent. Enfin,Move
et lesCopy
directives sont clairement ignorées lorsque le simulateur pas à pas dans. Étant donné que mes chaînes logiques conditionnelles sont quelque peu épiques, il y a beaucoup de place pour les bogues dans mon code et dans le simulateur. ;)Dans tous les cas, je soumets Lazy Lioness comme cas de test pour le diagnostic d'erreur ou le débogage du simulateur, ce qui, espérons-le, conduira à l'émergence d'une lionne pas si paresseuse que je pourrai ensuite simuler et affiner comme ma première soumission de bonne foi aux Bots compétition v2.
Ça ne fait rien
la source
Modified
condition au lieu de certainesEquals
Modified
condition est une invitation à une boucle infinie. Si je ne peux pas utiliser un contrôle de parité, je supprimerai simplement les lignes. Trouvez autre chose utile à mettre dedans. ;)sentinelle
amélioration
Gard
. Frappe les bots à proximité avec des drapeaux sur les 8 premières lignes. (c'est-à-dire tous les plus utilisés)la source
All(BotAt(D),Not(Equals(OLine(Mod(E,8)),Line(0))),Not(BotAt(Add(D,1,Mod(E,3))))):
CliqueBorg
Essayer de combiner la technologie CliqueBot et Borg pour créer un bot qui reconnaît des copies de lui-même malgré le décalage de ligne. Il commence également son processus de copie sur la dernière ligne de code exécutée sur le bot opposé, plutôt que sur la ligne 0, ce qui est plus susceptible de le geler en place mais également plus susceptible de conduire à une copie corrompue (en fait, je ne suis pas ça marche même, je ne l'ai pas testé et c'est assez complexe).
la source
Conduit par
Un dernier essai avant la date limite.
la source