Es ist Weihnachten im Juli. Was gibt es Schöneres, als ein virtuelles Geschenk für weiße Elefanten auszutauschen?
Für diese King of the Hill-Herausforderung musst du einen Bot erstellen, der in einer White Elephant-Tausch- Simulation mitspielt und versucht, das bestmögliche Geschenk zu erhalten.
Spielregeln
- Das Spiel wird über viele Runden gespielt, die jeweils aus einer variablen Anzahl von Runden bestehen.
- Rundenaufbau : Es gibt so viele Geschenke, wie Spieler im Spiel sind, wobei jeder Wert zufällig gleichmäßig im Bereich [0 ... 1] bewertet wird, wobei dieser Wert unbekannt ist, bis das Geschenk "geöffnet" wird. Die Spieler werden in zufälliger Reihenfolge in eine Warteschlange eingereiht. Der erste Spieler wird von vorne in die Warteschlange gestellt.
- Wenn ein Spieler an der Reihe ist, kann er entweder ein Geschenk öffnen oder das Geschenk eines anderen Spielers stehlen und an den Spieler übergeben, dessen Geschenk gestohlen wurde.
- Jedes Geschenk kann bis zu dreimal gestohlen werden.
- Sie können nicht von dem Spieler stehlen, der gerade von Ihnen gestohlen hat.
- Jeder Spieler kann jeweils nur ein Geschenk haben.
- Nachdem ein Geschenk geöffnet wurde, geht das Spiel zum nächsten Spieler über, der von der Vorderseite der Warteschlange aus erscheint. Dies ist der nächste Spieler in der Zugreihenfolge, der noch keinen Zug hatte.
- Round End : Wenn alle Geschenke geöffnet worden sind, endet die Runde, und der Wert der von jedem Spieler gehalten vorhanden hinzugefügt werden diesen Spieler Score. Es beginnt eine neue Runde, in der jeder Spieler kein Geschenk mehr hat und die Spielerreihenfolge gemischt wird.
- Spielende : Das Spiel endet , wenn mindestens ein Spieler bei erzielt hat
100500 Punkte, mit einem Sieg mit dem höchsten Gesamtwert von Geschenken an den Spieler vergeben.
Codierung
Alle Einsendungen sollten mit Python 3.7 kompatibel sein. Sie müssen eine Klasse schreiben, von der direkt geerbt wird WhiteElephantBot
. Zum Beispiel:
class FooBot(WhiteElephantBot):
# Your implementation here
Sie können eine __init__
Methode (die ein Argument name
akzeptiert) in Ihrer Bot-Klasse angeben, die aufgerufen werden muss super().__init__(name)
. Ihre Klasse muss über eine take_turn
Methode verfügen , die die folgenden Argumente in dieser Reihenfolge erwartet:
players
: Die Liste der Spielernamen aller Spieler, die noch keine Geschenke haben.presents
: Ein Wörterbuch, das Spielernamen auf 2 Tupel abbildet, die den aktuellen Wert dieses Spielers und die Häufigkeit des Diebstahls enthalten. Dies schließt nur andere Spieler ein, die gerade Geschenke in der Hand haben.just_stole
: Wenn die letzte Aktion ein Diebstahl war, ist dies der Name des Spielers, der gerade gestohlen hat. Wenn nicht, wird es seinNone
.
Jedes Argument ist unveränderlich oder ein neues Objekt, sodass eine Mutation keinen Einfluss auf das Spiel hat. Sie können eine Kopie aller Argumente aufbewahren, wenn Sie dies wünschen.
Ein Beispielwert für presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
Ihre take_turn
Methode sollte den Namen des Spielers zurückgeben, den Sie stehlen oder None
ein Geschenk öffnen möchten . Wenn es eine Ausnahme auslöst, etwas anderes als ein str
oder None
oder den Namen eines Spielers zurückgibt, von dem Sie nicht stehlen können, öffnen Sie standardmäßig ein Geschenk.
Ihr Konstruktor wird zu Beginn jeder Runde aufgerufen, sodass Sie sich nicht von Runde zu Runde an den Status erinnern können.
Durch das Erben von WhiteElephantBot
haben Sie Zugriff auf eine steal_targets
Methode, die das Präsensdiktat aufnimmt und just_stole
eine Liste der Namen der Spieler zurückgibt, von denen Sie stehlen können.
Alle Module, die Ihr Skript benötigt, müssen oben in Ihrem Eintrag importiert werden.
Testfahrer
Den Testfahrer finden Sie hier . Sie müssen from white_elephant import WhiteElephantBot
in Ihrer Antwort nicht enthalten sein, dies muss jedoch von einem lokalen Modul durchgeführt werden.
Baseline Wettbewerber
- Zufällig : Wählt zufällig aus, ob ein neues Geschenk geöffnet oder gestohlen werden soll, wobei das gestohlene Ziel gleichmäßig zufällig ausgewählt wird.
- Gierig : Stehlen Sie das wertvollste Geschenk, das gestohlen werden kann. Wenn keine Geschenke gestohlen werden können, öffnen Sie ein Geschenk.
- Schön : Öffnet immer ein neues Geschenk. Stiehlt niemals.
Zusätzliche Regeln
- Es liegt in Ihrer Verantwortung, alle Ausnahmen abzufangen. Wenn Ihre Klasse eine Ausnahme nicht abfängt, wird sie disqualifiziert. Bitte fangen Sie auch keine KeyboardInterrupts.
- Verwenden Sie keine Dateien oder andere Methoden, um die Unfähigkeit zu umgehen, den Status zwischen Spielen zu speichern. Sie können beispielsweise einen neuronalen Netzwerkstatus nicht während der Ausführung in einer Datei speichern.
- Ihr Bot muss im Klassencode und den zugehörigen Konstanten enthalten sein.
- Sie dürfen nur Standard-Bibliotheksimporte verwenden.
- Es gibt keine strengen Leistungsanforderungen. Seien Sie vernünftig und umsichtig. Wenn die Leistung zum Problem wird, behalte ich mir das Recht vor, Fristen hinzuzufügen.
Ein Eintrag pro Person.Wenn Sie mehr als einen Eintrag einreichen, können Ihre Bots möglicherweise nicht zusammenarbeiten. Ich werde vorerst mehrere Einträge pro Person zulassen, aber ich kann es später wieder zulassen, wenn es zu einem Problem wird.- Dies ist ein offener Wettbewerb ohne eindeutiges Enddatum. Es wird jedes Mal wiederholt, wenn sich wesentliche Änderungen ergeben haben.
EDIT1: Die Siegpunktzahl wurde von 100 auf 500 geändert, damit die Platzierungen konsistenter sind. Der Testfahrer hat einen neuen Bugfix und spiegelt auch die Änderungen der Siegpunkte wider.
EDIT2: Erläuterung zu erforderlichen Importen.
Bestenliste (Stand: 8. August 2018)
- SampleBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- ThresholdBot (390.480)
- Spieler (313.362)
- NiceBot (275.536)
- RandomBot (256.172)
- GoodSamaritan (136.298)
quelle
Antworten:
LastMinuteBot
(Mit großem Dank an @Mnemonic für das Grundgerüst des Codes, da ich Python kaum kenne.)
Profitieren Sie von der Tatsache, dass Geschenke nur dreimal gestohlen werden können, und stehlen Sie sich das dritte Mal, wenn Sie ein hochwertiges Geschenk finden und die meisten Geschenke bereits geöffnet wurden.
quelle
Odd Todd
Stiehlt das beste Geschenk, das er kann, möchte aber nicht die zweite Person sein, die ein Geschenk stiehlt, denn wenn es ihm gestohlen wird, kann er es nicht zurückbekommen.
quelle
==
statt eines=
in Ihrer Liste.SecondPlaceBot
Jeder wird für das wertvollste Geschenk kämpfen. Das nächstbeste Geschenk ist fast genauso gut, aber es ist viel weniger wahrscheinlich, dass es gestohlen wird.
quelle
ThresholdBot
Es ist uns eigentlich egal, ob wir das Beste bekommen Geschenk bekommen, nur etwas, das gut genug ist . Solange es etwas gibt, das es wert ist, gestohlen zu werden, werden wir es tun.
quelle
SampleBot
Führt 2000 Simulationen durch, wobei jeder Spieler gierig handelt und die beste Aktion auswählt.
quelle
Robin Hood
Stehlen Sie von den Reichen, die ihr Geschenk nicht verdient haben
quelle
Der gute Samariter
Geben Sie unglücklichen Menschen eine weitere Chance auf Glück
quelle
Spieler
Der Spieler ist süchtig, er versucht der letzte Spieler zu sein, dann setzt er auf ein neues Geschenk, um alle anderen Spieler zu besiegen.
quelle
Top3Bot
Dieser Bot versucht nicht, das bestmögliche Geschenk zu bekommen, sondern versucht, ein Geschenk zu bekommen, das> = (n-3) / n ist, wobei n die Anzahl der Geschenke ist. In den meisten Fällen wird es Geschenke geben, die so viel wert sind, und Top3Bot wird versuchen, eines davon in die Hände zu bekommen, aber es ist ihm egal, welches davon er bekommt.
quelle
__init__
fehlt seinself
Argument