Nous saluons le retour! Je suis ravi de présenter le 3e défi CodeBots. Celui-ci a été longtemps en préparation. Ce défi sera divisé en 3 sections: la version courte, la version longue et des détails supplémentaires.
La version courte
Chaque concurrent écrira un programme de 24 commandes. Ces bots se déplaceront dans le monde entier et copieront leur code dans d'autres bots, tout en essayant d'empêcher d'autres bots de faire de même. L'une des commandes possibles est le no-op Flag
. Si un bot a plus de vous Flag
que n'importe quel autre bot Flag
, vous obtenez un point. Vous gagnez en ayant le plus de points.
Tout ce qui précède était vrai pour les deux derniers défis. Cette fois-ci, les bots pourront exécuter plusieurs lignes de code en même temps.
La version longue
L'API
Chaque bot aura exactement 24 lignes, chaque ligne étant au format suivant:
$label command parameters //comments
Les étiquettes et les commentaires sont facultatifs et chaque commande a un nombre différent de paramètres. Tout est insensible à la casse.
Paramètres
Les paramètres sont saisis et peuvent être dans les formats suivants:
- Une valeur de 0 à 23.
- Une variable:
A
,B
,C
,D
- Une valeur utilisant l'addition:
A+3
ou2+C
- Une ligne de code, qui est désignée à l'aide du
#
signe (#4
représenterait la 5ème ligne, tandis#C+2
que représenterait la ligne calculée parC+2
). - Vous pouvez utiliser un
$label
au lieu de désigner une ligne de code. - Variable ou ligne de code de votre adversaire, désignée par
*
. Votre adversaire est le bot du carré auquel vous faites face. (*B
représente laB
valeur de votre adversaire , tandis que*#9
représente la 10ème ligne de votre adversaire). S'il n'y a personne dans ce carré, la commande n'est pas exécutée.
Commandes
Déplacer V
Déplace le bot North+(V*90 degrees clockwise)
. Le mouvement ne change pas de direction.
Tournez V
Transforme le bot V*90 degrees
dans sens horaire.
Copier VW
Des copies tout ce qui est en V
en W
. Si V
est un numéro de ligne, alors W
doit être un numéro de ligne. Si V
est une variable ou une valeur, alorsW
doit être une variable.
Drapeau
Ne fait rien.
Star de télévision
Démarre un nouveau thread attaché à la variable V
. Immédiatement, et à chaque tour futur, le thread exécutera la commande en ligneV
.
Si V
est déjà attaché à un thread, alors cette commande est un no-op. S'il V
s'agit d'une variable d'un adversaire, l'adversaire commencera un thread attaché à cette variable.
Arrêter V
Arrête le fil attaché à la variable V
à la fin de ce tour.
Lock V
Empêche la ligne ou la variable V
d'être utilisée de quelque manière que ce soit, sauf par le thread qui a appelé Lock
. Un appel ultérieur à Lock
par le même thread se déverrouille V
. Les verrous ne peuvent pas être appelés sur les variables ou les lignes de l'adversaire.
Si Cond VW
Cela va tester Cond
. Si la condition est vraie, elle déplacera le pointeur du thread vers le numéro de ligne V
, sinon vers le numéro de ligne W
. Cette ligne sera alors immédiatement exécutée.
Les conditions peuvent être X=Y
, X<Y
, !X
ou ?X
:
X=Y
teste si deux lignes sont du même type et du même bot, ou vous testez si deux valeurs égalent le même montant.X<Y
teste si la valeur deX
est inférieure àY
.!X
teste si la variable ou la ligneX
est verrouillée (renvoie vrai si verrouillé)?X
teste si une variable donnée a un thread attaché
Détails supplémentaires
Interactions multithread
Les actions du même type sont exécutées en même temps. Les actions sont exécutées dans l'ordre suivant:
Fermer à clé. Si plusieurs threads tentent de verrouiller une variable, ils échoueront tous. Si un thread déverrouille une variable alors qu'un autre tente de la verrouiller, la variable reste déverrouillée.
Début. Si plusieurs threads tentent de démarrer un thread sur une variable, cela comptera comme un seul démarrage.
Copie. Si deux threads copient tous les deux dans la même variable, la variable se terminera comme une valeur aléatoire. S'ils copient tous les deux sur la même ligne, aucun ne fonctionnera. Si un thread copie dans la même variable à partir de laquelle un autre thread copie, alors ce dernier thread copiera une valeur aléatoire. Si deux threads copient tous les deux à partir de la même variable, ils fonctionneront tous les deux correctement.
Si. Tous les conditionnels seront testés simultanément, puis les variables de thread seront mises à jour après. L'exécution d'un
If
peut entraîner l'ajout d'une action avec une priorité plus élevée. Les actions avec une priorité plus élevée seront exécutées avant de passer après leIf
, tandis que les actions avec une priorité plus faible seront exécutées après leIf
.Bouge toi. Plusieurs mouvements sur le même bot déplaceront le bot de la somme de tous les mouvements. Si plusieurs robots se retrouvent au même endroit, ils seront renvoyés à leur emplacement de départ.
Tour. Plusieurs tours sur le même bot résumeront.
Arrêtez. Plusieurs commandes d'arrêt sur la même variable compteront comme un seul arrêt.
Autres détails
Votre thread initial commence attaché à la D
variable
Récursif avec un If
(ayant une If
déclaration pointée sur lui-même) ne fera rien pour votre bot
Si un fil est arrêté après le verrouillage, ces verrous seront déverrouillés
Les actions pour utiliser une variable ou une ligne verrouillée ne feront rien.
Si un bot fait moins de 24 lignes, les lignes restantes seront remplies de Flag
Effectuer une écriture sur une variable qui est également attachée à un thread de départ aura en fait le thread démarrer son exécution sur la nouvelle valeur que le thread démarre le tour suivant.
Les robots sont placés dans un monde toroïdal selon le schéma suivant:
B...B...B...
..B...B...B.
B...B...B...
J'ai ajouté plusieurs exemples de robots qui sont commentés comme référence de langue.
Le contrôleur se trouve ici . J'y ai travaillé longtemps, mais il a probablement encore des bugs. Lorsque la spécification et le contrôleur se contredisent, la spécification est correcte.
Tableau d'affichage
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
la source
Réponses:
Scanner verrouillé Bot
Scanne l'ennemi aussi vite que possible et remplace les lignes par des drapeaux.
la source
DoubleTapBot
Ce bot a 3 fils: un pour se déplacer (A), les deux autres pour signaler (B et D). Drapeau B 1/2 tour, drapeau D 1/3 tour. Donc, à son tour, il doublera le drapeau de l'adversaire :).
Je suppose que C reviendra à 0 s'il dépasse 23.
Il devrait être assez sûr s'il a un certain tour pour se préparer (8 tours), car il gardera toujours au moins 2 threads (A et B) fonctionnant normalement.
Je ne peux pas l'essayer pour le moment, donc je ferai le test quand je serai de retour à la maison :)
la source
Double robinet stationnaire verrouillé
Inspiré par le DoubleTapBot de @ Katenkyo, celui-ci abandonne quelques drapeaux et tout espoir de mouvement en retour pour verrouiller complètement ses propres fils afin qu'il ne puisse jamais être reprogrammé. Il est cependant toujours possible d'avoir des drapeaux ennemis écrits dans des zones de code sans boucle.
la source
Déménageur aléatoire
Se déplace dans une direction aléatoire
la source
Épais décortiqué
Verrouille ses affaires autant qu'il le peut
la source
Bot attaquant
Copie les drapeaux dans divers emplacements
la source
Triple fil
Ce robot simple exécute trois threads tous avec le même code. Chaque thread attaque 1/3 de tour, se déplace 1/6, tourne 1/6 et fait la comptabilité 1/3.
la source
Banana Bot
Tente de lancer des bananes dans la roue ennemie avant que l'ennemi ne puisse rien faire. Sujette à être écrasée.
la source
Coupe-fil Bot
Arrêtez tous les threads ennemis avant de remplir votre code.
la source
Copie et auto-indicateur
Ce bot exécute trois threads. Le thread D se déplace jusqu'à ce qu'il rencontre un ennemi, puis essaie de copier un drapeau en eux, puis se déplace dans une direction aléatoire. Le thread A copie son propre drapeau sur les lignes non essentielles du code du bot. Le fil B n'est qu'un compteur. La variable, l'indicateur et les lignes de code utilisées par chaque thread sont entièrement verrouillées dans les 15 premiers tours, et le bot écrase presque tout son code de démarrage avec ses propres indicateurs. Je ne pense pas qu'il soit possible de convertir ce bot en bannière d'une autre équipe après le tour 15 sans qu'un bot d'attaque dédié ne fasse rien d'autre que d'y écrire des drapeaux.
la source
Move 0
c'est aller vers le nord, pas vers l'avant.