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é.
them
être déterministe / suivre les règles? Par exemple function 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 un StackOverflow
, 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/3371119
them(() => 'C')
ne résulterait pas en une erreur car lorsque l'adversaire appelle them
, il appelle la () => 'C'
fonction. La seule chose qui doit être enveloppée try-catch
serait si vous appelez them
avec un paramètre d'une fonction qui appelle them
avec un paramètre d'une fonction qui appelle them
etc. (infiniment). Par exemple, them(t => t(() => 'C'))
jouerait tout ce que l'adversaire jouerait si l'adversaire pensait qu'il jouait nice
. Il n'y a aucune possibilité d' stackoverflow
erreur.