Dans la Chine impériale, les rangs dans la société n'étaient pas déterminés par la naissance ou la richesse, mais par la capacité d'une personne à exceller dans les examens impériaux. L'empereur de jade, souverain divin des cieux, a demandé que tous ses sujets soient examinés pour déterminer leur valeur et à qui ensuite confier le mandat divin pour gouverner la Chine.
Règles de la bureaucratie:
- La bureaucratie divine se compose de rangs non négatifs à valeur entière, commençant par 0. Chaque membre (bot) de la bureaucratie appartient à un rang. Chaque rang peut contenir un nombre arbitraire de membres, mais ne peut être vide que si tous les rangs ci-dessus sont vides
- Au début du jeu, tous les membres ont le rang 0
- Chaque tour, chaque membre de la bureaucratie doit répondre à un examen. L'examen consiste à deviner correctement les valeurs booléennes d'une liste. La longueur de la liste est le numéro du rang au-dessus du membre.
- Les questions d'examen sont préparées par un membre aléatoire du rang supérieur. Les membres du rang le plus élevé obtiennent leurs questions directement du
JadeEmperor
(voir ci-dessous) - Un membre ayant obtenu au moins 50% à son examen est éligible à la promotion. Un membre ayant obtenu moins de 50% à son examen est admissible à la rétrogradation.
- Un membre éligible à la rétrogradation voit son rang diminué de un uniquement s'il y a un membre éligible à la promotion au grade ci-dessous pour prendre sa place.
- Tous les membres éligibles à la promotion voient leur rang augmenté de un tant que cela ne laisse aucun rang vide.
- Si tous les membres éligibles ne peuvent pas être rétrogradés ou promus, la préférence va à ceux des plus bas (pour rétrogradation) resp. score le plus élevé (pour la promotion). Les liens sont rompus au hasard.
- Le rang d'un membre ne peut changer que d'au plus 1 à chaque tour.
Règles du jeu:
- Chaque bot se verra attribuer un ID au hasard au début du jeu, qui ne changera pas au cours de son déroulement. Le
JadeEmperor
a l'ID -1, tous les autres ont des ID non négatifs consécutifs, en commençant par 0. - Tous les bots s'affrontent en même temps
- Le jeu se déroule sur 100 tours, le score du bot est son rang moyen possédé au cours de cette période.
- Le score total est acquis en exécutant 1000 matchs et en faisant la moyenne des résultats.
- Chaque Bot est une classe Python 3 implémentant les quatre fonctions suivantes:
ask(self,n,ID)
, ce qui fait un examen en renvoyant unlist
des booléens de longueur n. ID est l'ID du bot qui doit deviner cette liste.ask()
peut être appelé plusieurs fois au cours d'une même manche pour n'importe quel bot, mais pas du tout.answer(self,n,ID)
, qui est une tentative de réponse à un examen en renvoyant unlist
des booléens de longueur n. ID est l'ID du bot qui aask()
généré l'examen.answer()
est appelé exactement une fois par tour pour chaque bot.update(self,rankList,ownExam,otherExams)
est appelé une fois que le contrôleur a effectué toutes les rétrogradations et rétrogradations. Ses arguments sont: Une liste d'entiers, listant tous les rangs par ID de tous les bots; un tuple, composé de deux listes, d'abord les questions d'examen, puis les réponses du bot (au cas où il aurait oublié); puis une liste de tuples, composée également de paires examen-réponse, cette fois pour tous les examens distribués par le bot.__init__(self, ID, n)
transmet au bot son propre identifiant et le nombre de bots concurrents.
- Les classes sont autorisées à implémenter d'autres fonctions pour un usage privé
- Il est explicitement permis de définir d'autres variables et de les utiliser pour stocker des données sur les examens passés.
- La programmation des méta-effets est interdite, ce qui signifie que toute tentative d'accéder directement au code d'autres bots, au code du contrôleur, provoquant des exceptions ou similaires. Il s'agit d'un concours de stratégies pour les examens, pas de piratage de code.
- Les bots essayant de s'entraider sont explicitement autorisés, tant qu'ils ne le font pas via des méta-effets, mais uniquement par les informations transmises
update()
- D'autres langues ne sont autorisées que si elles peuvent être facilement converties en Python 3.
- La bibliothèque numpy sera importée en tant que
np
. La version est 1.6.5, ce qui signifie qu'elle utilise l'ancienne bibliothèque aléatoire. Si vous avez numpy 1.7, les anciennes fonctions sont disponibles sousnumpy.random.mtrand
pour les tests. N'oubliez pas de retirer le mtrand pour soumission. - Si un bot provoque une exception pendant l'exécution, il est disqualifié. Tout bot dont le code est tellement obscurci qu'il est impossible de dire s'il génère une liste de longueur n quand
ask()
ouanswer()
est appelé sera également disqualifié de manière préventive. Un bot me forçant à copier en profondeur les sorties obtient -1 sur le score. - Les noms de classe doivent être uniques
- Plusieurs bots par personne sont autorisés, mais seule la dernière version sera prise des bots mis à jour de manière itérative.
- Puisqu'il semble y avoir une certaine confusion sur la similitude des bots:
- Vous n'êtes pas autorisé à publier une copie d'un autre bot. C'est la seule échappatoire standard qui s'applique vraiment à ce défi.
- Vous êtes autorisé à partager du code avec d'autres robots, y compris des robots d'autres personnes.
- Vous n'êtes pas autorisé à soumettre un bot qui ne diffère d'un autre que par un changement trivial de la stratégie (comme un changement dans la graine pour la génération de la question), sauf si vous pouvez prouver que le nombre de ces bots de copie carbone est le minimum requis pour réussir mise en œuvre de leur stratégie (Ce sera généralement deux bots pour une coopération).
Exemples de bots:
Le JadeEmperor
fait toujours partie du jeu, mais ne participe pas à la compétition; il sert de générateur pour les examens des bots de rang le plus élevé. Ses examens sont aléatoires, mais pas uniformément, pour permettre aux robots intelligents de progresser.
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]
L' ivrogne produit des examens et des réponses de manière complètement aléatoire. Il fera partie du jeu.
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
Le plagiaire copie simplement les examens précédents. Il fera également partie du jeu.
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]
Code contrôleur disponible ici . Pour les tests, vous pouvez placer votre propre classe dans un fichier Contestants.py dans le même dossier, et ils seront importés.
Chatroom se trouve ici .
Les examens commencent!
Score actuel, en plus haute précision (10000 runs) pour le 20 octobre:
Des concours seront organisés avec chaque nouvelle inscription dans un avenir prévisible.
ID, n
mais les autres arguments de la méthode n, ID
?