En este desafío, escribirás un bot que juega el dilema del prisionero. Aquí está el truco: no tendrás acceso al historial de juegos anteriores. En cambio, tendrás acceso al oponente mismo. En esta versión, ambos jugadores obtienen +2 puntos si ambos cooperan, +1 puntos si ambos desertan, y si uno coopera pero uno falla, el desertor obtiene +3 mientras que el otro no obtiene puntos. Cada envío se jugará contra cualquier otro envío, incluido él mismo, 10 veces. El ganador es la presentación con más puntos totales.
Controlador : debe escribir una función de JavaScript, en el formulario
function submissionName(them) {
/* Your code here */
}
El controlador utiliza la name
propiedad de la función para mostrar los resultados, por lo que si no está en este formato (y en su lugar, f = x => ...
o f = function() { ... }
) será difícil ver su puntaje y no podrá acceder a su propia función.
La función aceptará un parámetro: them
que es la función del oponente. Luego puede llamar a esa función para ver cuál sería la reacción del oponente que recibiría ciertas funciones como entradas. En función de esos datos, debe devolver 'C' o 'D' para cooperar o desertar, respectivamente.
Ejemplos (estarán compitiendo):
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'));
}
El controlador está disponible aquí.
reglas :
- No podrás ver el código del oponente. Todas las funciones están ajustadas para que se vean iguales cuando
toString()
se llama. La única forma de examinar a un oponente (que podría ser usted mismo) es probarlo. - Su función no tiene que ser determinista. Solo puede guardar el estado estableciendo propiedades en su propia función, como
submissionName.state = {};
. Sin embargo, entre partidos (incluso entre partidos de los mismos jugadores), el estado se borra llamandotoString()
yeval
. Por lo tanto, no hay memoria de coincidencias anteriores. - El orden de qué función se llama primero en cada coincidencia es aleatorio.
- Si su código arroja un error, será tratado como si cooperara mientras su oponente desertó. Si eres el primero en correr, ni siquiera se invocará el código del oponente. Esto sucede incluso si el error ocurre en el código de tu oponente mientras estás llamando
them
. Tenga cuidado con los errores de desbordamiento de pila, especialmente si su código llamathem(wrap(submissionName))
, ya que podrían hacer lo mismo. - No puede acceder a la variable
self
, ni a ninguna otra variable que esté dentro del alcance cuandoeval
se llama EXCEPTO la funciónwrap
. Esta función le permite llamar al oponente de una manera indistinguible de cómo el controlador llama a una función. No puede escribirle aMath
,window
etc. (puede usar funciones comoMath.random()
, sin embargo). - No puede acceder al seguimiento de la pila creando un
Error
método o algún otro.
Una nota sobre tomar demasiado tiempo: evite quedarse atrapado en un while
bucle para siempre. El tiempo combinado de ambos competidores no debe exceder 1 segundo en una ronda determinada. Para hacer cumplir esto, se elige un tiempo de espera aleatorio entre 1000 ms y 2000 ms (esto es para evitar el juego al esperar intencionalmente una cantidad de tiempo conocida), y si el trabajador tarda más que eso en ejecutarse, se generará un error. Si esto sucede, la causa del error se determinará de la siguiente manera: la ejecución se pausará en un momento aleatorio después de 1000 ms, y se inspeccionará la pila de llamadas en ese momento. Se culpará al competidor llamado más recientemente que se encuentra actualmente en un bucle (o una recursión similar a un bucle, en el sentido de que es una recurrencia configurada para evitar un error de desbordamiento de pila). Si se culpa al mismo competidor por causar un error de "demorarse demasiado" varias veces, ese competidor será descalificado.
them
ser determinista / seguir las reglas? Por ejemplo function me(them){let log=0;them(x=>{++log;return 'C';})
; return log == 0? 'D': 'C';}
StackOverflow
error y no un bucle infinito que nunca se cierra. Si puede resultar en un StackOverflow
, asegúrese de agregar una declaración try-catch. Para un ejemplo de recursión que no alcanza un error de stackoverflow en 1 segundo, necesita ejemplos más oscuros como stackoverflow.com/q/12438786/3371119
them(() => 'C')
no daría lugar a un error porque cuando el oponente llama them
, llama a la () => 'C'
función. Lo único que debe envolverse try-catch
sería si llama them
con un parámetro de alguna función que llama them
con un parámetro de alguna función que llama, them
etc. (infinitamente). Por ejemplo, them(t => t(() => 'C'))
jugaría cualquier cosa que el oponente jugaría si el oponente pensara que estaba jugando nice
. No hay posibilidad de stackoverflow
error.