Dans ce défi, vous écrirez un bot qui joue le dilemme du prisonnier. Voici le hic: vous n'aurez pas accès à l'historique des jeux précédents. Au lieu de cela, vous aurez accès à l'adversaire lui-même. Dans cette version, les deux joueurs gagnent +2 points s'ils coopèrent tous les deux, +1 points s'ils font tous les deux défaut, et si l'un coopère mais un défaut, le transfuge gagne +3 tandis que l'autre n'obtient aucun point. Chaque soumission sera jouée contre chaque autre soumission, y compris elle-même, 10 fois. Le gagnant est la soumission avec le plus de points.
Contrôleur : vous devez écrire une fonction javascript, sous la forme
function submissionName(them) {
/* Your code here */
}
Le contrôleur utilise la name
propriété de la fonction pour afficher les résultats, donc s'il n'est pas dans ce format (et est à la place f = x => ...
ou f = function() { ... }
), il sera difficile de voir votre score et vous ne pourrez pas accéder à votre propre fonction.
La fonction acceptera un paramètre: them
qui est la fonction de l'adversaire. Il peut alors appeler cette fonction pour voir quelle réaction de l'adversaire se verrait attribuer certaines fonctions en entrée. Sur la base de ces données, vous devez renvoyer «C» ou «D» respectivement pour coopérer ou pour défaut.
Exemples (seront en compétition):
function cooperate(them) {
return 'C';
}
function defect(them) {
return 'D';
}
function nice(them) {
// Do whatever they would do when faced with a cooperator
return them(wrap(_ => 'C'));
}
Le contrôleur est disponible ici
Règles :
- Vous ne pourrez pas voir le code de l'adversaire lui-même. Toutes les fonctions sont encapsulées de sorte qu'elles se ressemblent lors de l'
toString()
appel. La seule façon d'examiner un adversaire (qui pourrait être vous-même) est de le tester. - Votre fonction n'a pas à être déterministe. Vous ne pouvez enregistrer l'état qu'en définissant des propriétés sur votre propre fonction, telles que
submissionName.state = {};
. Cependant, entre les matchs (même entre les matchs des mêmes joueurs), l'état est effacé en appelanttoString()
eteval
. Par conséquent, il n'y a pas de mémoire des correspondances précédentes. - L'ordre dans lequel la fonction est appelée en premier dans chaque correspondance est aléatoire.
- Si votre code renvoie une erreur, il sera traité comme si vous aviez coopéré pendant que votre adversaire faisait défection. Si vous êtes le premier à courir, le code de l'adversaire ne sera même pas appelé. Cela se produit même si l'erreur se produit dans le code de votre adversaire pendant que vous appelez
them
. Méfiez-vous des erreurs de débordement de pile, surtout si votre code appellethem(wrap(submissionName))
, car elles pourraient faire de même. - Vous ne pouvez pas accéder à la variable
self
ou à toute autre variable qui se trouve être dans la portée lorsqu'elleeval
est appelée SAUF la fonctionwrap
. Cette fonction vous permet d'appeler l'adversaire d'une manière qui ne se distingue pas de la façon dont le contrôleur appelle une fonction. Vous ne pouvez pas écrireMath
,window
etc. (Vous pouvez utiliser des fonctions telles queMath.random()
, cependant). - Vous ne pouvez pas accéder à la trace de pile en créant un
Error
ou par une autre méthode.
Une note pour prendre trop de temps: veuillez éviter de rester coincé dans un while
boucle pour toujours. Le temps combiné des deux concurrents ne doit pas dépasser 1 seconde dans une manche donnée. Pour appliquer cela, un timeout aléatoire entre 1000 ms et 2000 ms est choisi (c'est pour éviter de jouer en attendant intentionnellement un temps connu), et si le travailleur met plus de temps à s'exécuter, une erreur sera lancée. Si cela se produit, la cause de l'erreur sera déterminée comme suit: l'exécution sera interrompue à un moment aléatoire après 1000 ms et la pile d'appels à ce moment sera inspectée. Le concurrent le plus récemment appelé qui est actuellement dans une boucle (ou une récursion de type boucle, dans le sens où il s'agit d'une récursivité configurée pour éviter une erreur de débordement de pile) sera blâmé. Si le même concurrent est blâmé d'avoir causé plusieurs fois une erreur de "prise trop longue", ce concurrent sera disqualifié.
la source
them
être déterministe / suivre les règles? Par exemplefunction me(them){let log=0;them(x=>{++log;return 'C';})
; retourner le journal == 0? 'D': 'C';}StackOverflow
erreur et non une boucle infinie qui ne se ferme jamais. Si cela peut entraîner unStackOverflow
, assurez-vous d'ajouter une instruction try-catch. Pour un exemple de récursivité qui n'atteint pas une erreur de stackoverflow en 1 seconde, vous avez besoin d'exemples plus obscurs comme stackoverflow.com/q/12438786/3371119them(() => 'C')
ne résulterait pas en une erreur car lorsque l'adversaire appellethem
, il appelle la() => 'C'
fonction. La seule chose qui doit être enveloppéetry-catch
serait si vous appelezthem
avec un paramètre d'une fonction qui appellethem
avec un paramètre d'une fonction qui appellethem
etc. (infiniment). Par exemple,them(t => t(() => 'C'))
jouerait tout ce que l'adversaire jouerait si l'adversaire pensait qu'il jouaitnice
. Il n'y a aucune possibilité d'stackoverflow
erreur.Réponses:
BoomBot
Si l'adversaire est exécuté en premier et l'appelle sans
try..catch
, ce bot gagne automatiquement 3 points. Zéro point dans tous les autres cas.la source
Archéoptéryx
cooperate
, imitez le mouvement de l'adversairedefect
.defect
ou avecnice
, alors défaut.Qu'est-ce qui en fait une bonne stratégie? Je n'ai aucune idée. Je l'ai généré en utilisant un algorithme évolutif, formé en partie sur les soumissions actuelles.
Tiktaalik
cooperate
, alors inversez le mouvement de l'adversaire contredefect
.defect
, alors il fait défaut.notNice
.Une autre stratégie générée par l'évolution.
la source
WhatWouldBotDoBot
WhatWouldBotDoBot est assez simple; il teste simplement son adversaire pour ce qu'il ferait contre un programme en régime permanent. Si un bot préfère coopérer si possible, WWBDB préfèrera également la coopération (donc il coopérera avec le gentil bot). La WWBDB ne préfère pas elle-même la coopération.
la source
Vérifier avec état
S'ils m'invoquent, alors ils seront probablement vraiment eux. Nous agissons comme transfuge. S'ils ne m'invoquent pas, alors ils seront probablement un testeur emballé. Nous serions plus gentils.
Ci-dessus est la réponse originale. Et peut-être que je devrais me faire une coopération pour gagner plus de points.
Vérifiez l'état avec l'auto-coop
la source
RandomBot
Parce que pourquoi pas.
la source
Complexité
Tests de complexité pour voir si le bot est Coopérer ou Défaut. S'il l'est, il coopère, mais s'il ne l'est pas, il fait défaut. Tous les bots actuels qui testent leurs adversaires utilisent des fonctions simples pour tester les réponses, donc Complexity fera simplement semblant de coopérer dans ces cas.
la source
Comment je veux que cela fonctionne, c'est toujours un défaut, sauf en jouant contre soi-même. Il essaie de le faire en passant une fonction "testeur" qui ne leur est pas encapsulée, et il essaie de détecter si "eux" est nommé testeur. S'il est nommé testeur, il change la variable statique activée en true, puis renvoie coopère. Mais ça ne marche pas. Je ne suis pas trop familier avec javascript, et je vais probablement apporter quelques modifications supplémentaires.
la source
tester
fonction: DPas gentil
Imite la réaction de l'adversaire à la déviation
la source
NotNice 2
Version anti-boom de NotNice par FatalError .
la source
Bon sens
Avertissement: je ne connais pas javascript.
Si vous pouvez profiter d'une bonne personne, faites-le. Sinon, restituez ce qu'ils retourneraient s'ils se trouvaient confrontés à une coopération (du moins, c'est ce que je pense que cela fait).
la source
Et toi, où veux-tu aller? (inspiré des volumes du livre de la jungle)
la source
this
est identique à self. Je pense que tu voulais direreturn them(yourself)
.this
n'est pas une variable, c'est un mot-clé, et dans le contexte d'une fonctionthis!=self
.self
signifierait l'objet fenêtre etthis
la fonction elle-même (fait toujours référence au contexte dans lequel il se trouve, c'est pourquoi il n'est pas considéré comme une variable). C'est pourquoi avoirvar self = this;
au début de nombreux exemples de code peut être considéré comme trompeur. Version ajoutée sans le "this"this
ne fait pas référence à la fonction.yourself
etyourself_no_this
exécuter varient différemment.this
ne fait essentiellement jamais référence à la fonction en javascript. Voir: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Punir les inspecteurs
Donnez du code au bot et voyez s'il l'exécute. S'il a été exécuté plus d'une fois, le bot est un mauvais inspecteur, et nous devons faire défaut! Si elle a été exécutée exactement une fois, jouez comme un robot pas sympa. S'il n'a jamais été exécuté, coopérez.
Histoire
Que ferait le dernier bot que j'ai vu contre cet adversaire?
Résultats pour un tournoi à 10000 tours:
la source
Mal essaie de déterminer si c'est à l'intérieur d'une simulation ou non. Si c'est le cas, il suppose que le vrai code lui sera finalement transmis
them
et essaie diverses stratégies pour les convaincre de coopérer.S'il ne sait pas avec certitude, il vérifie s'il peut être défectueux gratuitement, ou sinon, essaie de copier ce
them
qui ferait quand on lui donnerait un coopérateur.la source
TrickyBot
Essayez d'être imprévisible
la source
autoappliquer
Je ne sais pas si cela a du sens, mais cela semble intéressant! Faites-vous comme vous le faites pour vous-même, répétez pour attraper le hasard. Si cela ne fonctionne pas, soyez gentil.
Non testé, et mon premier code javascript, et plus complexe que ce à quoi je m'attendais.
la source
selfapply(selfapply)
appelleselfapply(selfapply)
!RandomAlternate
J'ai donc appris à utiliser les propriétés pour l'état ...
la source
Assassiner Bot # 1
Provoque une boucle infinie dans laquelle il est plus probable que l'adversaire sera blâmé.
la source
Le robot de la règle du platine
La règle de platine stipule "Traitez les autres comme ils veulent être traités". Mon bot accepte cela. Quoi qu'ils se fassent, ce que nous supposons être la façon dont ils voudraient être traités, nous le faisons pour eux. S'ils lancent une erreur, nous supposons qu'ils veulent coopérer.
la source
TheGolfedOne (nom de fonction:)
a
, 63 octetsLe code golfé est difficile à lire. À cause de cela,
them
va se casser.Je n'ai pas bien compris la mécanique sous ce KotH, mais je suppose que si l'adversaire est apatride, j'ai juste besoin de les briser pendant que je fais défaut.
Résultat de son premier tournoi (je n'ai pas pris la peine d'utiliser tous les bots, désolé)
Il ne fait pas aussi mal que je le pensais, 3ème place (parmi ceux-ci) premier essai.
Deuxième essai,
a
j'ai encore 260, 3e encore, derrièreonlyTrustYourself
etdefect
encore. Cela pourrait être cohérent à la fin :)PS: Je ne suis pas très bon avec le golf, donc c'est plus pour la blague qu'autre chose. Ici, je n'ai raccourci que les noms de variable, le nom de fonction et supprimé autant d'espaces que possible.
la source
Karma
Si l'adversaire veut coopérer avec nous, alors nous coopérerons. S'ils essayaient de faire défaut lorsque nous avons coopéré, nous ferons aussi défaut.
la source