W lipcu są święta, więc czy jest lepszy sposób na świętowanie niż wymiana prezentów z wirtualnym białym słoniem!
Aby podjąć wyzwanie King of the Hill, musisz stworzyć bota, który gra w symulacji wymiany Białego Słonia , starając się uzyskać jak najcenniejszy prezent.
Zasady gry
- Gra będzie się toczyć przez wiele rund, z których każda składa się ze zmiennej liczby tur.
- Konfiguracja rundy : w grze będzie tyle prezentów, ile jest graczy, każdy wyceniany losowo równomiernie w przedziale [0 ... 1), przy czym ta wartość jest nieznana do momentu „otwarcia” teraźniejszości. Gracze zostaną ułożeni w losowej kolejności w kolejce. Pierwszy gracz zostanie wyskakujący z przodu kolejki.
- Kiedy nadchodzi kolej gracza, może on albo otworzyć prezent, albo ukraść prezent innego gracza, przekazując kolejkę graczowi, którego prezent został skradziony.
- Każdy prezent może zostać skradziony do 3 razy.
- Nie możesz kraść od gracza, który właśnie cię ukradł.
- Każdy gracz może mieć tylko jednego na raz.
- Po otwarciu prezentu postępy w grze do następnego gracza wyskakują z przodu kolejki. Będzie to następny gracz w kolejności, który nie miał jeszcze tury.
- Koniec rundy : Po otwarciu wszystkich prezentów runda się kończy, a wartość prezentu każdego gracza jest dodawana do wyniku tego gracza. Rozpoczyna się nowa runda, w której każdy gracz nie ma teraz prezentu, a kolejność graczy jest tasowana.
- Koniec gry : Gra zakończy się, gdy co najmniej jeden gracz uzyska
100500 punktów, a zwycięstwo zostanie przyznane graczowi o najwyższej łącznej wartości prezentów.
Kodowanie
Wszystkie zgłoszenia powinny być zgodne z Python 3.7. Musisz napisać klasę, która bezpośrednio dziedziczy WhiteElephantBot
. Na przykład:
class FooBot(WhiteElephantBot):
# Your implementation here
Możesz podać __init__
metodę (która wymaga jednego argumentu name
) w swojej klasie botów, którą należy wywołać super().__init__(name)
. Twoja klasa musi mieć take_turn
metodę oczekującą następujących argumentów w tej kolejności:
players
: Lista nazwisk graczy w kolejności wszystkich graczy, którzy jeszcze nie mają prezentów.presents
: Słownik, który odwzorowuje nazwy graczy na 2-krotki zawierające aktualną wartość posiadaną przez tego gracza i liczbę kradzieży tego prezentu. Dotyczy to tylko innych graczy, którzy obecnie trzymają prezenty.just_stole
: Jeśli ostatnią podjętą akcją była kradzież, będzie to nazwa gracza, który właśnie ukradł. Jeśli nie, to będzieNone
.
Każdy argument będzie niezmienny lub nowy obiekt, więc mutowanie któregokolwiek z nich nie będzie miało wpływu na grę. Możesz zachować kopię dowolnego z argumentów, jeśli sobie tego życzysz.
Przykładowa wartość dla presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
Twoja take_turn
metoda powinna zwrócić nazwę gracza, którego chcesz ukraść lub None
otworzyć prezent. Jeśli zgłosi wyjątek, zwróci coś innego niż a str
lub None
nazwisko gracza, od którego nie możesz ukraść, domyślnie otworzysz prezent.
Twój konstruktor będzie wywoływany na początku każdej rundy, więc nie będziesz pamiętać stanu z rundy na rundę.
Dziedzicząc po WhiteElephantBot
, będziesz miał dostęp do steal_targets
metody, która zabierze prezent z dykt just_stole
i zwróci listę nazwisk graczy, z których możesz ukraść.
Wszystkie moduły, których potrzebuje skrypt, muszą zostać zaimportowane u góry wpisu.
Kierowca testowy
Sterownik testowy można znaleźć tutaj . Nie musisz dołączać do from white_elephant import WhiteElephantBot
opublikowanej odpowiedzi, jednak moduł lokalny będzie musiał to zrobić.
Podstawowi konkurenci
- Losowo : Wybiera losowo, czy otworzyć nowy prezent, czy ukraść, a cel kradzieży wybierany jest losowo.
- Chciwy : ukraść najcenniejszy prezent, który można ukraść. Jeśli nie można ukraść prezentów, otwórz prezent.
- Fajnie : zawsze otwiera nowy prezent. Nigdy nie kradnie.
Dodatkowe zasady
- Twoim obowiązkiem jest uchwycić wszystkie wyjątki. Jeśli twoja klasa nie złapie wyjątku, zostanie zdyskwalifikowany. Ponadto nie wyłapuj Przerwania Keyboard.
- Nie używaj plików ani innych metod w celu ominięcia niemożności zapisania stanu między grami. Nie można na przykład zapisać stanu sieci neuronowej do pliku w trakcie uruchamiania.
- Twój bot musi być samowystarczalny w ramach kodu klasy i powiązanych stałych.
- Możesz używać tylko standardowych importów bibliotek.
- Nie ma ścisłych wymagań dotyczących wydajności. Bądź rozsądny i rozważny. Jeśli wydajność stanie się problemem, zastrzegam sobie prawo do dodania limitów czasowych.
Jedno wejście na osobę.Jeśli prześlesz więcej niż jeden wpis, boty mogą nie działać razem. Na razie zezwalam na wiele wpisów na osobę, ale może później ponownie go odbanować, jeśli stanie się to problemem.- To jest otwarty konkurs bez wyraźnej daty zakończenia. Zostanie ponownie uruchomiony za każdym razem, gdy będę w stanie, gdy nastąpią znaczące zmiany.
EDYCJA 1: Zmieniono zwycięski wynik ze 100 na 500, aby ranking był bardziej spójny. Sterownik testowy ma nową poprawkę błędów, a także odzwierciedla zmiany wyniku wygranej.
EDYCJA 2: Nota wyjaśniająca na temat wymaganego przywozu.
Tabela liderów (od 8 sierpnia 2018 r.)
- SampleBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- ThresholdBot (390.480)
- Hazardzista (313.362)
- NiceBot (275,536)
- RandomBot (256.172)
- GoodSamaritan (136.298)
źródło
Odpowiedzi:
LastMinuteBot
(Wielkie podziękowania dla @Mnemonic za szkielet kodu, ponieważ ledwo znam Pythona.)
Skorzystaj z faktu, że prezentów nie można skradzić więcej niż trzykrotnie, a następnie dokonaj trzeciego kradzieży, jeśli znajdziesz prezent o wysokiej wartości i większość prezentów została już otwarta.
źródło
Dziwny Todd
Kradnie najlepszy prezent, jaki może, ale nie chce być drugą osobą, która może ukraść prezent, ponieważ jeśli zostanie mu skradziony, nie może go odzyskać.
źródło
==
zamiast=
zrozumienia listy.SecondPlaceBot
Wszyscy będą walczyć o najcenniejszy prezent. Następny najlepszy prezent jest prawie tak samo dobry, ale znacznie mniej prawdopodobne, że zostanie skradziony.
źródło
ThresholdBot
Tak naprawdę nie zależy nam na tym, aby otrzymać najlepszy prezent, wystarczy coś dobrego . Tak długo, jak jest coś wartego kradzieży, będziemy to robić.
źródło
SampleBot
Uruchamia 2000 symulacji, w których każdy gracz zachowuje się zachłannie i wybiera najlepszą akcję.
źródło
RobinHood
Kradnij bogatym, którzy nie zdobyli prezentu
źródło
Dobry Samarytanin
Daj pechowcom kolejną szansę na szczęście
źródło
Gracz
Gracz jest uzależniony, stara się być ostatnim graczem, a potem gra o nowy prezent, aby pokonać wszystkich innych graczy.
źródło
Top3Bot
Ten bot nie próbuje uzyskać najlepszego możliwego prezentu, ale próbuje uzyskać prezent o wartości> = (n-3) / n, gdzie n jest liczbą prezentów. W większości przypadków będą prezenty cenione tak bardzo, a Top3Bot spróbuje zdobyć jeden z nich, ale tak naprawdę nie obchodzi go, który z nich dostanie.
źródło
__init__
brakuje jejself
argumentu