Concours terminé! Lisez les commentaires sur les blobs pour voir leur score.
Ce KoTH est vaguement inspiré par la simulation de sélection naturelle de Primer . Votre bot est un blob. Pour survivre, vous devez manger des boulettes pour regagner de l'énergie, qui est utilisée pour se déplacer. Avec plus d'énergie, les gouttes peuvent se diviser en deux.
Énergie et mouvement
Votre blob démarre à chaque tour avec 100 énergies, et il n'a pas de limite sur la quantité d'énergie qu'il peut collecter. Chaque tour se déroule à tour de rôle, chaque goutte ayant la possibilité de se déplacer vers le nord, l'est, le sud ou l'ouest dans un tour donné, ou de rester immobile. Se déplacer utilise 1 énergie et rester immobile utilise 0,25 énergie. La longueur du côté de la carte estceil(0.25 * blobCount) * 2 - 1
unités, avec un minimum de 9 unités. Tous les blobs commencent sur le bord de la carte, avec un placé dans chaque coin et chaque blob suivant étant placé à 2 unités des autres. Tous les 30 tours, une vague de pellets est placée dans des endroits aléatoires autour de la carte, à au moins 1 unité de n'importe quel bord. Chaque fois qu'une vague de pastilles apparaît, la quantité de pastilles (à l'origine deux fois le nombre de taches ou la largeur de la carte, la plus grande des deux) dans la vague suivante est diminuée de 1, forçant le nombre de taches à diminuer avec le temps. Chaque pastille restaure entre 5 et 15 énergies. Lorsque l'énergie d'un blob est inférieure ou égale à 0, il meurt.
En mangeant
Si deux gouttes ou plus tentent d'occuper le même emplacement, celui qui a le plus d'énergie mangera les autres, recevant leur énergie. Si les deux ont une énergie égale, les deux disparaissent.
Détection et information
Les blobs peuvent voir les pellets ou autres blobs à une distance de 4 unités. Lorsque leurs fonctions sont appelées, les blobs sont fournis avec:
- La longueur latérale de la carte
- La position du blob sur la carte
- Les positions de toutes les pastilles dans leur rayon de recherche, ainsi que leurs valeurs
- Les positions de tous les blobs dans leur rayon de recherche, ainsi que leur énergie et leurs UID
- L'énergie, l'UID et les emplacements de l'objet blob dont la fonction est en cours d'exécution
- Un objet de stockage unique au blob
- Un objet de stockage partagé par tous les objets blob liés à l'objet blob via le fractionnement
Scission
Si un blob a plus de 50 énergies, il peut choisir de se diviser. Le fractionnement coûte 50 énergie, et toute énergie restante est répartie également entre les deux blobs. Tous les blobs sont des originaux ou des copies fractionnées, chaque copie remontant à un original. Tous ces éléments ensemble sont des «parents». Tous les parents ont un objet de stockage commun. Les proches peuvent toujours se manger et peuvent se séparer, utiliser leur propre objet de stockage ou collecter de l'énergie sans affecter les autres.
Transfert d'énergie
Si deux blobs sont côte à côte (après avoir bougé), l'un des robots peut transférer de l'énergie à l'autre. Cela se fait en revenant SendNorth(amt)
, SendEast(amt)
, SendSouth(amt)
ou SendWest(amt)
, avec amt
étant un nombre représentant le montant envoyé. Il peut s'agir de tout montant que l'expéditeur peut se permettre, y compris toute son énergie. Il est recommandé de dire à la goutte qui reçoit de l'énergie de rester immobile grâce au stockage commun, afin qu'elle ne s'éloigne pas lorsque l'énergie est transférée (bien que l'énergie ne soit pas déduite du total de l'expéditeur dans ce cas).
Fonctions, stockage et UID
Afin de permettre des comportements d'apprentissage plus complexes, tous les blobs recevront un UID entier (Unique Identifer). Ces UID seront générés aléatoirement sur chaque carte, empêchant les stratégies basées sur des cibles individuelles. Lorsque la fonction d'un blob est appelée, quatre arguments lui sont transmis:
- La longueur latérale de la carte sous forme d'entier
- Un objet avec deux tableaux:,
pellets
etblobs
. Les deux tableaux contiennent des objets, les deux ayant unepos
propriété contenant la position du culot ou du blob au format[x,y]
. Les granulés auront uneenergy
propriété, tandis que les blobs auront uneuid
propriété et uneenergy
propriété - Objet contenant diverses propriétés du blob il est transmis à:
energy
,uid
, etpos
. Lepos
tableau est formaté comme[x,y]
- Un objet contenant les deux objets de stockage du blob. Une
self
propriété contient un objet de stockage individuel qui peut être modifié comme le blob le souhaite (en manipulant les propriétés de l'objet transmis) et unecommunal
propriété qui peut être modifiée par n'importe quel parent.
Les blobs ne sont pas déplacés immédiatement pour éviter que les virages précédents / ultérieurs aient un avantage. Tous les mouvements sont traités en groupes (toutes les collisions / manger, puis toutes les boulettes, puis se séparer, etc.) Si une goutte tombe sur une pastille ou une goutte plus petite et, dans le processus utilise sa dernière énergie, la goutte consommera toujours la pastille / l'énergie indépendamment du fait que cela porterait son énergie totale au-dessus de 0.
Pour que les objets blob relatifs se reconnaissent, le stockage commun doit être utilisé pour chaque objet blob pour enregistrer son UID dans un tableau ou via un autre système.
Valeurs de retour
Pour déplacer ou diviser, la valeur de retour de la fonction est utilisée. Tout d'abord, la signification des directions cardinales en termes de coordonnées:
- Nord = -Y
- Est = + X
- Sud = + Y
- Ouest = -X
Notez que [0,0]
c'est le coin supérieur gauche et Y augmente à mesure que vous descendez. La valeur de retour de la fonction doit suivre ces règles:
- Pour ne rien faire: ne renvoyer rien, 0, null, non défini, faux ou toute autre valeur équivalente à false
- Pour se déplacer: Renvoyez l'une des quatre variables globales: Nord, Est, Sud ou Ouest, qui correspondent à "nord", "est", "sud" ou "ouest" (qui pourraient également être utilisées comme valeur de retour)
- Pour fractionner: renvoyer la variable globale SplitNorth, SplitEast, SplitSouth ou SplitWest, la direction indiquant où placer le nouveau blob
Si une commande de division est renvoyée et que la quantité d'énergie requise est supérieure ou égale à l'énergie de la goutte, rien ne se passera. Les blobs ne pourront pas quitter la carte.
Fonctions de bibliothèque prédéfinies
Il existe quelques fonctions de base disponibles par défaut, pour gagner du temps:
taxiDist (pt1, pt2)
Renvoie la distance du taxi entre deux points (distance X plus distance Y).
taxiDist([0, 0], [2, 2]) //4
taxiDist([3, 4], [1, 5]) //3
taxiDist([1.25, 1.3], [1.3, 1.4]) //0.15
taxiDist([0, 0], [5, 2.5], 2.5) //3
taxiDist([0, 0], [2, 4], 2.5) //2.4
hypotDist (pt1, pt2)
Renvoie la distance entre deux points selon le théorème de Pythagore
hypotDist([0, 0], [5, 12]) //13
hypotDist([4, 6], [8, 9]) //5
hypotDist([0, 1], [2, 1]) //2
hypotDist([1, 1], [2, 2]) //sqrt(2)
modDir (dir, amt)
Prend la direction entrée, pivote de 90 degrés dans le sens horaire amt
, puis renvoie la nouvelle valeur.
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
Exemple d'objet blob
Cette goutte ne bougera pas tant qu'elle ne trouvera pas de boulette à proximité. Ensuite, il ira dans la direction qu'il pense la plus susceptible de le récompenser. Si son énergie dépasse jamais 150, il se divisera.
function(map, near, me, storage) {
if (me.energy > 150)
return SplitNorth;
if (!near.pellets.length)
return null;
var dirs = [0, 0, 0, 0];
for (let p, i = 0; i < near.pellets.length; i++) {
p = near.pellets[i];
dirs[0] += me.pos[1] - p.pos[1];
dirs[1] += p.pos[0] - me.pos[0];
dirs[2] += p.pos[1] - me.pos[1];
dirs[3] += me.pos[0] - p.pos[0];
}
return [North, East, South, West][dirs.indexOf(Math.max(...dirs))];
}
Règles
- Les échappatoires standard sont interdites. En outre, aucune échappatoire non standard.
- Aucun blob ne peut tenter de modifier ou de lire les données qui ne lui sont pas transmises via ses paramètres
- Aucun blob ne peut tenter de modifier une variable de valeur de retour pour saboter d'autres blobs
- Un tour dure jusqu'à ce que les seuls blobs restants soient des parents
- Aucun blob ne peut modifier les données en injectant des fonctions dans ses paramètres qui modifient les valeurs à l'aide du
this
mot - clé - Toutes les soumissions doivent être en Javascript ou dans une langue qui n'est pas trop différente de Javascript (Python, par exemple). Toutes les réponses seront converties en Javascript pour le concours.
- Le gagnant est le blob qui a collecté la plus grande quantité d'énergie au total à travers tous les tours (soit des boulettes, soit des petits blobs qui ne sont pas apparentés)
Contrôleur: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
Chatroom: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth