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.
fuente
them
ser determinista / seguir las reglas? Por ejemplofunction 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 unStackOverflow
, 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/3371119them(() => 'C')
no daría lugar a un error porque cuando el oponente llamathem
, llama a la() => 'C'
función. Lo único que debe envolversetry-catch
sería si llamathem
con un parámetro de alguna función que llamathem
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 jugandonice
. No hay posibilidad destackoverflow
error.Respuestas:
BoomBot
Si el oponente se ejecuta primero y se queda sin él
try..catch
, este bot automáticamente gana 3 puntos. Cero puntos en cualquier otro caso.fuente
Arqueoptérix
cooperate
, imite el movimiento del oponente en contradefect
.defect
o connice
, entonces el defecto.¿Qué hace que esta sea una buena estrategia? No tengo idea. Lo generé usando un algoritmo evolutivo, entrenado en parte en los envíos actuales.
Tiktaalik
cooperate
, entonces invierte el movimiento del oponente contradefect
.defect
falla , entonces defecto.notNice
.Otra estrategia generada evolutivamente.
fuente
WhatWouldBotDoBot
WhatWouldBotDoBot es bastante simple; solo prueba a su oponente para saber qué haría contra un programa de estado estable. Si un bot prefiere cooperar si es posible, WWBDB también preferirá la cooperación (por lo que cooperará con un buen bot). WWBDB no prefiere por sí mismo la cooperación.
fuente
Verificar con estado
Si me invocan, entonces probablemente sean realmente ellos. Actuamos como desertor. Si no me invocan, entonces probablemente sean un probador envuelto. Actuaríamos como más amables.
Arriba está la respuesta original. Y tal vez debería hacerme cooperar para ganar más puntos.
Compruebe con estado con autocoop
fuente
RandomBot
Porque, porque no.
fuente
Complejidad
Pruebas de complejidad para ver si el bot es Cooperar o Defecto. Si es así, coopera, pero si no lo es, falla. Todos los bots actuales que prueban a sus oponentes usan funciones simples para probar las respuestas, por lo que Complexity solo pretenderá cooperar en esos casos.
fuente
Lo que quiero que funcione es siempre desertar, excepto cuando se juega contra uno mismo. Intenta hacerlo pasando una función de "probador" que no está ajustada a ellos, e intenta detectar si "ellos" se llama probador. Si se llama probador, cambia la variable estática activada a verdadero, luego devuelve cooperar. Pero no funciona. No estoy muy familiarizado con JavaScript, y probablemente haré algunos cambios más.
fuente
tester
función: DNo está bien
Imita la reacción del oponente a la desviación.
fuente
NotNice 2
Versión a prueba de auge de NotNice por FatalError .
fuente
Sentido común
Descargo de responsabilidad: no sé javascript.
Si puedes sacar provecho de una buena persona, hazlo. De lo contrario, devuelva lo que devolverían si se enfrentaran a cooperar (al menos, eso es lo que creo que hace).
fuente
¿Y tú a dónde vas? (inspirado en los voltios del libro de la jungla)
fuente
this
es lo mismo que self. Creo que querías decirloreturn them(yourself)
.this
no es una variable, es una palabra clave y en el contexto de una funciónthis!=self
.self
significaría el objeto de ventana ythis
la función en sí misma (siempre se refiere al contexto en el que se encuentra, es por eso que no se considera como una variable). Es por eso que tenervar self = this;
en el comienzo de muchos ejemplos de código podría considerarse engañoso. Versión agregada sin el "this"this
no se refiere a la función.yourself
yyourself_no_this
correr varían de manera diferente.this
básicamente nunca se refiere a la función en javascript. Ver: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Castigar a los inspectores
Dale un código al bot y mira si lo ejecuta. Si se ejecutó más de una vez, el bot es un malvado inspector, ¡y debemos desertar! Si se ejecutó exactamente una vez, juega como un bot no agradable. Si nunca se ejecutó, coopere.
Historia
¿Qué haría el último bot que vi contra este oponente?
Resultados de un torneo de 10000 rondas:
fuente
Mal intenta determinar si está dentro de una simulación o no. Si es así, se supone que eventualmente se le pasará el código real
them
e intenta varias estrategias para convencerlos de que cooperen.Si no está seguro, verifica si puede desertar de forma gratuita, o si no, intenta copiar lo
them
que haría cuando se le da un cooperador.fuente
TrickyBot
Intenta ser impredecible
fuente
auto-aplicación
No estoy seguro si tiene sentido, ¡pero parece interesante! Haz lo que te haces a ti mismo, repite para atrapar el azar. Si eso no funciona, sé amable.
Sin probar, y mi primer código javascript, y más complejo de lo que esperaba.
fuente
selfapply(selfapply)
llamaselfapply(selfapply)
!Aleatorio Alternativo
Entonces aprendí a usar propiedades para el estado ...
fuente
Asesinato Bot # 1
Provoca un bucle infinito en el que es más probable que se culpe al oponente.
fuente
La regla de platino Bot
La regla del platino establece "Trata a los demás de la forma en que quieren ser tratados". Mi bot lo acomoda. Lo que sea que se hagan a sí mismos, lo que suponemos es cómo les gustaría ser tratados, lo hacemos con ellos. Si arrojan un error, asumimos que quieren cooperar.
fuente
TheGolfedOne (nombre de func .:)
a
, 63 bytesEl código de golf es difícil de leer. Por eso,
them
se romperá.No entendí completamente la mecánica bajo este KotH, pero supongo que si el oponente no tiene estado, solo necesito romperlo mientras deserto.
El resultado de su primer torneo (no me molesté en usar todos los bots, lo siento)
No le está yendo tan mal como pensé, 3er lugar (entre esos) primer intento.
Segundo intento,
a
obtuve 260 nuevamente, 3er lugar nuevamente, detrásonlyTrustYourself
ydefect
otra vez. Puede ser consistente al final :)PD: No soy tan bueno con el golf, así que es más una broma que otra cosa. Aquí solo acorté nombres de variables, nombres de funciones y eliminé la mayor cantidad de espacios en blanco posible.
fuente
Karma
Si el oponente cooperaría con nosotros, entonces cooperaremos. Si intentaran desertar cuando cooperamos, también lo haremos.
fuente