W cesarskich Chinach o randze w społeczeństwie nie decydowały narodziny ani bogactwo, ale zdolność człowieka do przodowania w egzaminach cesarskich. Nefrytowy Cesarz, boski władca Niebios, wezwał do zbadania wszystkich jego poddanych w celu ustalenia ich wartości i do przekazania Boskiego mandatu do rządzenia Chinami.
Zasady biurokracji:
- Boska Biurokracja składa się z nieujemnych szeregów o wartości całkowitej, zaczynających się od 0. Każdy członek (bot) biurokracji należy do jednej rangi. Każda ranga może posiadać dowolną liczbę członków, ale nie może być pusta, chyba że wszystkie rangi powyżej są puste
- Na początku gry wszyscy członkowie mają rangę 0
- Na każdym kroku każdy członek biurokracji musi odpowiadać na egzamin. Egzamin polega na prawidłowym odgadnięciu wartości boolowskich listy. Długość listy to numer rangi nad członkiem.
- Pytania egzaminacyjne są przygotowywane przez losowego członka powyższej rangi. Członkowie najwyższej rangi otrzymują pytania bezpośrednio z
JadeEmperor
(patrz poniżej) - Członek, który uzyska co najmniej 50% na egzaminie, kwalifikuje się do promocji. Członek, który uzyska mniej niż 50% na egzaminie, kwalifikuje się do obniżenia.
- W przypadku członka kwalifikującego się do obniżenia ranga jego ranga została zmniejszona o jeden tylko, jeśli jego miejsce zajmuje członek kwalifikujący się do promocji na niższej pozycji.
- Wszyscy członkowie kwalifikujący się do promocji mają zwiększoną rangę o jeden, o ile nie pozostawia to pustej rangi.
- Jeśli nie wszyscy kwalifikujący się członkowie mogą zostać zdegradowani lub awansowani, pierwszeństwo mają osoby o najniższym poziomie (dla zdegradowania) lub. najwyższy wynik (za promocję). Więzy są zrywane losowo.
- Ranga członka może się zmienić maksymalnie o 1 w każdej turze.
Zasady gry:
- Każdemu botowi zostanie losowo przypisany identyfikator na początku gry, który nie zmieni się w trakcie gry.
JadeEmperor
Ma ID-1, wszystkie inne mają kolejnych identyfikatorów nieujemne, od 0. - Wszystkie boty konkurują w tym samym czasie
- Gra trwa 100 tur, a wynikiem bota jest jego średnia pozycja w tym czasie.
- Całkowity wynik jest uzyskiwany przez uruchomienie 1000 gier i uśrednienie wyników.
- Każdy bot to klasa Python 3 implementująca następujące cztery funkcje:
ask(self,n,ID)
, co sprawia, że egzamin jestlist
zwracany przez boolean o długości n. ID to identyfikator bota, który musi odgadnąć tę listę.ask()
może być wywoływany wiele razy podczas jednej rundy dla dowolnego bota, ale też wcale.answer(self,n,ID)
, która jest próbą odpowiedzi na egzamin przez zwrócenielist
liczby booleanów o długości n. ID to identyfikator bota, któryask()
wygenerował egzamin.answer()
nazywa się dokładnie raz na rundę dla każdego bota.update(self,rankList,ownExam,otherExams)
jest wywoływany, gdy kontroler wykona wszystkie za i przeciw. Jego argumentami są: Lista liczb całkowitych, zawierająca wszystkie rangi według identyfikatora wszystkich botów; krotka składająca się z dwóch list, najpierw pytań egzaminacyjnych, a następnie odpowiedzi udzielonych przez bota (na wypadek, gdyby zapomniał); następnie lista krotek, podobnie składająca się z par egzamin-odpowiedź, tym razem do wszystkich egzaminów, które wykonał bot.__init__(self, ID, n)
przekazuje botowi swój własny identyfikator i liczbę konkurujących botów.
- Klasy mogą implementować inne funkcje do użytku prywatnego
- Definiowanie dalszych zmiennych i wykorzystywanie ich do przechowywania danych o poprzednich egzaminach jest wyraźnie dozwolone.
- Programowanie meta-efektów jest zabronione, co oznacza wszelkie próby bezpośredniego dostępu do kodu innych botów, kodu kontrolera, powodujące wyjątki lub podobne. To jest konkurs strategii na egzaminy, a nie hakowanie kodu.
- Boty próbujące sobie nawzajem pomagać są wyraźnie dozwolone, o ile nie robią tego za pomocą meta-efektów, ale wyłącznie na podstawie przekazywanych informacji
update()
- Inne języki są dozwolone tylko w przypadku, gdy można je łatwo przekonwertować na Python 3.
- Numer biblioteki zostanie zaimportowany jako
np
. Wersja to 1.6.5, co oznacza, że używa starej losowej biblioteki. Jeśli masz Numpy 1.7, stare funkcje są dostępne wnumpy.random.mtrand
celu przetestowania. Pamiętaj, aby usunąć mtrand w celu przesłania. - Jeśli bot spowoduje wyjątek podczas działania, zostanie zdyskwalifikowany. Wszelkie bot którego kod jest tak ukrywane, że to niemożliwe, aby powiedzieć, czy to generuje listę długości n, gdy
ask()
alboanswer()
nazywa zostanie zdyskwalifikowany także zapobiegawczo. Bot zmuszający mnie do głębokiego kopiowania wyników otrzymuje -1 na wynik. - Nazwy klas muszą być unikalne
- Dozwolonych jest wiele botów na osobę, ale pobierana będzie tylko najnowsza wersja iteracyjnie zaktualizowanych botów.
- Ponieważ wydaje się, że istnieje pewne zamieszanie dotyczące podobieństwa bota:
- Jesteś niedozwolone aby umieścić kopię innego bota. To jedyna standardowa luka, która naprawdę ma zastosowanie w tym wyzwaniu.
- Jesteś wolno mieć kod wspólny z innymi robotami, w tym boty innych ludzi.
- Teraz nie wolno złożyć bot, który różni się od drugiego tylko trywialny zmiany strategii (podobnie jak zmiany w nasieniu do generowania zapytania) , chyba że można udowodnić, że liczba takich botów kopiowanie węgla jest minimalna wymagana sukces uchwalenie ich strategii (zwykle będą to dwa boty do współpracy).
Przykładowe boty:
JadeEmperor
Jest zawsze częścią gry, ale nie konkurować; służy jako generator do egzaminów botów najwyższej rangi. Jego egzaminy są losowe, ale nie jednolite, aby umożliwić inteligentnym botom awans.
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]
Drunkard produkuje egzaminy i odpowiedź całkowicie losowo. Będzie częścią gry.
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
Plagiarist tylko kopie poprzednich egzaminów. Będzie także częścią gry.
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]
Kod kontrolera dostępny tutaj . W celu przetestowania możesz umieścić własną klasę w pliku Contestants.py w tym samym folderze i zostaną one zaimportowane.
Chatroom można znaleźć tutaj .
Rozpoczęły się egzaminy!
Aktualny wynik, z większą precyzją (10000 przebiegów) dla października 20:
Konkursy będą przeprowadzane przy każdym nowym wpisie w dającej się przewidzieć przyszłości.
ID, n
innych metod n, ID
?