En la China imperial, los rangos de la sociedad no se decidían por nacimiento o riqueza, sino por la capacidad de una persona para sobresalir en los exámenes imperiales. El Emperador de Jade, el divino gobernante de los Cielos, ha pedido que todos sus súbditos sean examinados para determinar su valor, y a quién dar el Mandato Divino para gobernar China.
Reglas de la burocracia:
- La Divina Burocracia consiste en rangos de valores enteros no negativos, comenzando con 0. Cada miembro (bot) de la burocracia pertenece a un rango. Cada rango puede contener muchos miembros arbitrarios, pero no puede estar vacío a menos que todos los rangos anteriores estén vacíos
- Al comienzo del juego, todos los miembros tienen rango 0
- Cada turno, cada miembro de la burocracia tiene que responder a un examen. El examen consiste en adivinar correctamente los valores booleanos de una lista. La longitud de la lista es el número del rango por encima del miembro.
- Las preguntas del examen son preparadas por un miembro aleatorio del rango anterior. Los miembros del rango más alto obtienen sus preguntas directamente del
JadeEmperor
(ver más abajo) - Un miembro que obtenga al menos un 50% en su examen es elegible para la promoción. Un miembro que obtenga menos del 50% en su examen es elegible para Demotion.
- A un miembro elegible para Demotion se le reduce su rango en uno solo si hay un miembro elegible para Promoción en el rango siguiente para tomar su lugar.
- Todos los miembros elegibles para la promoción tienen su rango aumentado en uno siempre que esto no deje ningún rango vacío.
- Si no todos los miembros elegibles pueden ser degradados o promocionados, la preferencia se aplicará a los de menor (para Demotion) resp. puntuación más alta (para promoción). Los lazos se rompen al azar.
- El rango de un miembro solo puede cambiar como máximo 1 por turno.
Reglas del juego:
- A cada bot se le asignará aleatoriamente una ID al comienzo del juego, que no cambiará a lo largo de su curso. El
JadeEmperor
tiene el ID -1, todos los demás tienen IDs no negativos consecutivos, comenzando con 0. - Todos los bots compiten al mismo tiempo.
- El juego dura 100 turnos, el puntaje del bot es su rango promedio poseído durante ese tiempo.
- La puntuación total se adquiere al ejecutar 1000 juegos y promediar los resultados.
- Cada Bot es una clase de Python 3 que implementa las siguientes cuatro funciones:
ask(self,n,ID)
, que realiza un examen devolviendo unlist
booleano de longitud n. ID es la ID del bot que tiene que adivinar esa lista.ask()
se puede llamar muchas veces durante una sola ronda para cualquier bot, pero tampoco en absoluto.answer(self,n,ID)
, que es un intento de responder a un examen devolviendo unlist
booleano de longitud n. ID es la ID del bot queask()
generó el examen.answer()
se llama exactamente una vez por ronda para cada bot.update(self,rankList,ownExam,otherExams)
se llama una vez que el controlador ha realizado todos los Pro y Demotions. Sus argumentos son: Una lista de enteros, que enumera todos los rangos por ID de todos los bots; una tupla, que consta de dos listas, primero las preguntas del examen, luego las respuestas que dio el bot (en caso de que se haya olvidado); luego una lista de tuplas, que consiste de manera similar en pares examen-respuesta, esta vez para todos los exámenes que el bot entregó.__init__(self, ID, n)
le pasa al bot su propia identificación y el número de bots competidores.
- Las clases pueden implementar otras funciones para uso privado.
- Se permite explícitamente definir más variables y usarlas para almacenar datos sobre exámenes pasados.
- Los metaefectos de programación están prohibidos, lo que significa que cualquier intento de acceder directamente al código de otros bots, el código del controlador, causando excepciones o similares. Este es un concurso de estrategias para los exámenes, no de pirateo de códigos.
- Los bots que intentan ayudarse entre sí están explícitamente permitidos, siempre que no lo hagan a través de metaefectos, sino únicamente por la información transmitida
update()
- Solo se permiten otros idiomas en caso de que se puedan convertir fácilmente a Python 3.
- La biblioteca numpy se importará como
np
. La versión es 1.6.5, lo que significa que usa la antigua biblioteca aleatoria. Si tiene Numpy 1.7, las funciones antiguas están disponiblesnumpy.random.mtrand
para probar. Por favor, recuerde quitar la mtrand para enviarla. - Si un bot causa una excepción durante el tiempo de ejecución, se descalifica. Cualquier robot cuyo código es tan ofuscado que es imposible decir si se genera una lista de longitud n cuando
ask()
oanswer()
se llama también será descalificado de forma preventiva. Un bot que me obliga a copiar en profundidad obtiene -1 en la puntuación. - Los nombres de clase deben ser únicos
- Se permiten varios bots por persona, pero solo se tomará la última versión de los bots actualizados de forma iterativa.
- Dado que parece haber cierta confusión sobre la similitud de bot:
- No está permitido publicar una copia de otro bot. Esta es la única escapatoria estándar que realmente se aplica en este desafío.
- Se le permite compartir código con otros bots, incluidos los bots de otras personas.
- No está permitido enviar un bot que difiera de otro solo por un cambio trivial a la estrategia (como un cambio en la semilla para la generación de preguntas) a menos que pueda probar que el número de tales bots de copia de carbón es el mínimo requerido para tener éxito promulgación de su estrategia (generalmente serán dos bots para una cooperación).
Bots de ejemplo:
El JadeEmperor
siempre es parte del juego, pero no compite; Él sirve como generador para los exámenes de los robots de mayor rango. Sus exámenes son aleatorios, pero no de manera uniforme, para permitir a los robots inteligentes una forma de avanzar.
class JadeEmperor:
def __init__(self):
pass
def ask(self,n,ID):
num=min(np.random.exponential(scale=np.sqrt(np.power(2,n))),np.power(2,n)-1)
bi=list(np.binary_repr(int(num),width=n))
return [x=='0' for x in bi]
El borracho produce exámenes y respuestas completamente al azar. Él será parte del juego.
class Drunkard:
def __init__(self,ID,n):
pass
def ask(self,n,ID):
return list(np.random.choice([True,False],size=n,replace=True))
def answer(self,n,ID):
return list(np.random.choice([True,False],size=n,replace=True))
def update(self,rankList,ownExam,otherExams):
pass #out
El plagio solo copia los exámenes anteriores. Él también será parte del juego.
class Plagiarist:
def __init__(self,ID,n):
self.exam=[True]
def ask(self,n,ID):
return (self.exam*n)[0:n]
def answer(self,n,ID):
return (self.exam*n)[0:n]
def update(self,rankList,ownExam,otherExams):
self.exam=ownExam[0]
Código de controlador disponible aquí . Para las pruebas, puede colocar su propia clase en un archivo Contestants.py en la misma carpeta, y se importarán.
Sala de chat se puede encontrar aquí .
Los exámenes comienzan!
Puntuación actual, en mayor precisión (10000 carreras) para Oct20:
Los concursos se ejecutarán con cada nueva entrada en el futuro previsible.
ID, n
del otro método n, ID
?