Nella Cina imperiale, i ranghi nella società non erano decisi dalla nascita o dalla ricchezza, ma dalla capacità di una persona di eccellere negli esami imperiali. L'Imperatore di giada, divino sovrano dei Cieli, ha chiesto che tutti i suoi sudditi fossero esaminati per determinare il loro valore, e a chi dare successivamente il mandato divino per governare la Cina.
Regole della burocrazia:
- La burocrazia divina è composta da ranghi non negativi con valori interi, che iniziano con 0. Ogni membro (bot) della burocrazia appartiene a un rango. Ogni grado può contenere arbitrariamente molti membri, ma non può essere vuoto a meno che tutti i gradi sopra non siano vuoti
- All'inizio del gioco, tutti i membri hanno il grado 0
- Ogni turno, ogni membro della burocrazia deve rispondere a un esame. L'esame consiste nell'indovinare correttamente i valori booleani di un elenco. La lunghezza dell'elenco è il numero del rango sopra il membro.
- Le domande dell'esame sono preparate da un membro casuale del grado sopra. I membri di rango più alto ricevono le loro domande direttamente dal
JadeEmperor
(vedi sotto) - Un membro che ottiene almeno il 50% del proprio esame è idoneo per la promozione. Un membro con un punteggio inferiore al 50% sul proprio esame è idoneo per Demotion.
- Un membro idoneo per Demotion ha il suo grado ridotto di uno solo se c'è un membro idoneo per la promozione nel grado sottostante per prendere il suo posto.
- Tutti i membri idonei per la promozione hanno il loro rango aumentato di uno a condizione che non rimanga vuoto.
- Se non tutti i membri idonei possono essere retrocessi o promossi, la preferenza va a quelli più bassi (per Demotion) resp. punteggio più alto (per promozione). I legami si spezzano casualmente.
- Il grado di un membro può cambiare al massimo di 1 al massimo per turno.
Le regole del gioco:
- Ad ogni bot verrà assegnato casualmente un ID all'inizio del gioco, che non cambierà nel corso. L'
JadeEmperor
ha l'ID -1, tutti gli altri hanno ID non negativi consecutivi, iniziando con 0. - Tutti i robot competono allo stesso tempo
- Il gioco dura 100 turni, il punteggio del bot è il suo rango medio posseduto in quel periodo.
- Il punteggio totale viene acquisito eseguendo 1000 partite e calcolando la media dei risultati.
- Ogni Bot è una classe Python 3 che implementa le seguenti quattro funzioni:
ask(self,n,ID)
, che effettua un esame restituendo un valorelist
booleano di lunghezza n. ID è l'ID del bot che deve indovinare quell'elenco.ask()
può essere chiamato più volte durante un singolo round per qualsiasi bot, ma anche per niente.answer(self,n,ID)
, che è un tentativo di rispondere a un esame restituendo un valorelist
booleano di lunghezza n. ID è l'ID del bot che haask()
generato l'esame.answer()
viene chiamato esattamente una volta per round per ogni bot.update(self,rankList,ownExam,otherExams)
viene chiamato dopo che il Controller ha eseguito tutte le Pro e le Demozioni. I suoi argomenti sono: un elenco di numeri interi, che elenca tutti i ranghi per ID di tutti i bot; una tupla, composta da due elenchi, prima le domande d'esame, quindi le risposte fornite dal bot (nel caso in cui si fosse dimenticato); quindi un elenco di tuple, similmente composto da coppie esame-risposta, questa volta per tutti gli esami che il bot ha distribuito.__init__(self, ID, n)
passa al bot il proprio ID e il numero di bot concorrenti.
- Le classi possono implementare altre funzioni per uso privato
- La definizione di ulteriori variabili e il loro utilizzo per archiviare dati sugli esami passati è esplicitamente consentito.
- I meta-effetti di programmazione sono vietati, vale a dire qualsiasi tentativo di accedere direttamente al codice di altri robot, al codice del controllore, causando eccezioni o simili. Questo è un concorso di strategie per gli esami, non di hacking del codice.
- I robot che cercano di aiutarsi a vicenda sono esplicitamente ammessi, purché non lo facciano tramite meta-effetti, ma puramente dalle informazioni passate
update()
- Altre lingue sono consentite solo nel caso in cui possano essere facilmente convertite in Python 3.
- La libreria numpy verrà importata come
np
. La versione è 1.6.5, nel senso che utilizza la vecchia libreria casuale. Se hai intorpidito 1.7, le vecchie funzioni sono disponibilinumpy.random.mtrand
per il test. Ricorda di eliminare il mtrand per l'invio. - Se un bot provoca un'eccezione durante il runtime, viene squalificato. Qualsiasi bot il cui codice è così offuscato che è impossibile dire se genera un elenco di lunghezza n quando
ask()
oanswer()
viene chiamato verrà squalificato anche preventivamente. Un bot che mi obbliga a produrre copie in profondità ottiene -1 sulla partitura. - I nomi delle classi devono essere univoci
- Sono consentiti più robot per persona, ma solo i più recenti bot verranno aggiornati in modo iterativo.
- Dal momento che sembra esserci un po 'di confusione sulla somiglianza dei bot:
- Non puoi pubblicare una copia di un altro bot. Questa è l'unica scappatoia standard che si applica davvero a questa sfida.
- È consentito avere un codice condiviso con altri bot, inclusi i bot di altre persone.
- Non è consentito inviare un bot che differisce da un altro solo per una banale modifica della strategia (come una modifica del seme per la generazione della domanda) a meno che non si possa dimostrare che il numero di tali bot di copia carbone è il minimo richiesto per il successo attuazione della loro strategia (che di solito saranno due robot per una cooperazione).
Robot di esempio:
Fa JadeEmperor
sempre parte del gioco, ma non compete; funge da generatore per gli esami di robot di alto livello. I suoi esami sono casuali, ma non in modo uniforme, per consentire ai robot intelligenti di avanzare.
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]
Il Drunkard produce esami e risposte in modo completamente casuale. Farà parte del gioco.
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
Il plagio copia solo gli esami precedenti. Farà anche parte del gioco.
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]
Codice controller disponibile qui . Per i test, puoi inserire la tua classe in un file Contestants.py nella stessa cartella e verranno importati.
Chatroom può essere trovato qui .
Gli esami iniziano!
Punteggio attuale, con maggiore precisione (10000 corse) per Oct20:
I concorsi verranno organizzati con ogni nuova voce per il prossimo futuro.
ID, n
gli altri argomenti del metodo n, ID
?