In der Zukunft, in der Time Travel (abgekürzt als TT) weit verbreitet sein wird, wird das Werfen von Münzen ein ernstzunehmender Gedankensport. Um uns auf die Zukunft vorzubereiten, veranstalten wir einen Wettbewerb für Programme, bei denen Zeitreisen aus Sicht der Beiträge wirklich stattfinden.
Der Wettbewerb ist im Round-Robin-Stil und besteht aus Münzwurfspielen zwischen Java-Klassen.
Regeln des Münzwurfspiels
- Es gibt zwei Spieler und 100 Runden.
- In jeder Runde wird eine Münze geworfen und basierend auf dem Ergebnis erhält einer der Spieler 1 Punkt. Jeder Spieler hat eine 50% ige Chance, einen Punkt zu erzielen.
- Nach dem Werfen haben beide Spieler die Möglichkeit, die Zeit durch Ziehen der Hebel zu kontrollieren.
- Wenn Sie einen blauen Hebel (Revert Stopper) ziehen, ist kein TT mehr möglich, um den Hebel oder eine frühere Runde zu drehen. Der Versuch von TT, an diesen Runden teilzunehmen, hat keine Wirkung.
- Wenn Sie einen roten Hebel ziehen , versuchen Sie, die Zeit auf eine frühere Runde zurückzustellen. Bei Erfolg wird das Gedächtnis des Gegners vor der gewählten Runde auf sein Gedächtnis zurückgesetzt und die Münzwurfergebnisse ab der gewählten Runde werden ebenfalls gelöscht . Das einzig mögliche Zeichen für Ihren Gegner in Bezug auf den TT ist die Anzahl der nicht verwendeten Hebel, die nicht zurückgesetzt werden.
- Jeder Spieler hat zu Beginn des Spiels 5 blaue und 20 rote, nicht benutzte Hebel. Diese Hebel werden von TTs nicht beeinflusst.
- Wenn am Ende einer 100. Runde kein TT stattfindet, endet das Spiel und der Spieler mit der höheren Punktzahl gewinnt.
Einzelheiten
- Runden haben eine 1-basierte Indizierung (Form 1 bis 100).
- Vor der Runde erhalten
x
Sie die Anzahl der verfügbaren blauen und roten Hebel, die Münzwurfergebnisse bis zum Zugx
(einschließlich) und die Erinnerung an Ihren (letzten)x-1
Runde. - Das Ziehen eines blauen Hebels in der Runde
x
stoppt alle TTs, die ein Ziel in der Rundex
oder davor haben (es blockiert eine TT, wenn es genau in dieser Runde auch passiert). - Zurück zur Runde
x
bedeutet, dass die nächste Runde rund istx
. - Wenn beide Spieler am Ende einer Runde zurückkehren, wird die Zeit auf das frühere Ziel zurückgesetzt, das nicht gesperrt ist. Die Spieler, die versucht haben, zu dieser Zeit zurückzukehren, behalten ihr Gedächtnis.
Technische Details
- Sie sollten eine Java-Klasse schreiben, die die bereitgestellte Bot-Schnittstelle implementiert.
- Fügen Sie Ihren Bot zum Projekt hinzu.
- Fügen Sie eine Instanz Ihres Bots zu der
Bot
in der Datei hinzuController.java
. - Ihre Klasse sollte keine Informationen zwischen Anrufen speichern . (In den meisten Fällen wird
final
diese Anforderung erfüllt, wenn nur Variablen außerhalb von Funktionen vorhanden sind.) - Sie können dem Controller im
memory
Feld Ihres zurückgegebenenAction
Objekts Informationen geben . Dies wird dir in der nächsten Runde zurückgegeben, wenn kein TT passiert ist. Wenn ein TT passiert, erhalten Sie die entsprechende frühere Erinnerung von Ihnen. - Sie können die
totalScore()
Methode derGame
Klasse verwenden, um die Bewertung einer Verlaufszeichenfolge abzurufen.
Protokoll
An jeder Ecke wird Ihre
takeTurn(...)
Methode mit 5 Argumenten aufgerufen:- die Anzahl der nicht verwendeten blauen Hebel
- die Anzahl der nicht verwendeten roten Hebel
- Die Münzwurfhistorie ist eine Zeichenfolge aus 1 und 0, die Ihre Gewinne und Verluste in den vorherigen Runden kennzeichnet. Das erste Zeichen entspricht dem ersten Münzwurf. (In der ersten Runde beträgt die Länge der Saite
1
.) - eine Zeichenfolge, Ihre gespeicherte Erinnerung aus der vorherigen Runde
- der 1-basierte Index dieser Runde
Bei jedem Zug gibt Ihre Methode ein
Action
Objekt zurück, das enthälteine Ganzzahl in dem
move
Feld, das Ihre Aktion beschreibt:0
für keine aktion-1
einen blauen Hebel zu ziehen und TTs zu blockieren, die diese Runde durchlaufen- Eine positive ganze Zahl
x
, die nicht größer als die aktuelle Runde ist, um einen roten Hebel zu ziehen und zu versuchen, wieder zur Runde zurückzukehrenx
- Ungültige Ganzzahlen werden als behandelt
0
.
eine Zeichenfolge mit Ihrem Gedächtnis aus dieser Runde, die Sie beibehalten möchten. Beachten Sie, dass das Speichern von Speicherplatz kein wesentlicher Bestandteil der Herausforderung ist . Sie können gute Eingaben machen, ohne nützliche Daten in der Zeichenfolge zu speichern. In der ersten Runde ist die Zeichenfolge eine leere Zeichenfolge.
Ihre Methode sollte im Durchschnitt nicht länger als 10 ms pro Runde dauern.
- Regelmäßiges Nichteinhalten der Frist führt zur Disqualifikation.
Wertung
- Wenn Sie ein Match gewinnen, erhalten Sie 2 Punkte und ein Unentschieden 1 Punkt für beide Spieler. Verlust verdient keine Punkte.
- Die Punktzahl eines Bots ist die Gesamtzahl der gesammelten Punkte.
- Die Anzahl der Matches, die zwischen jedem Teilnehmerpaar ausgetragen werden, hängt von der Anzahl der Einsendungen und ihrer Geschwindigkeit ab.
Zwei einfache Beispiel-Bots werden als Antworten gepostet.
Der Controller und die ersten paar Bots sind hier verfügbar .
Testergebnisse mit bis zum 3. November eingereichten Bots:
Gesamtpunktzahl:
Oldschool: 3163
Random: 5871
RegretBot: 5269
Nostalgia: 8601
Little Ten: 8772
Analyzer: 17746
NoRegretsBot: 5833
Oracle: 15539
Deja Vu: 5491
Bad Loser: 13715
(Der Controller basiert auf dem Controller der Cat Catcher Challenge . Vielen Dank, dass @flawr ihn als Basis für diesen verwendet hat.)
Bonus: Ein schöner 6-minütiger Film, der auf einem ähnlichen Konzept basiert.
quelle
If you pull a blue lever (revert stopper) no TT is possible through that round anymore. TT's attempting to go through the round will have no effect.
Was ist "eine Runde durchmachen"?If you pull a blue lever (revert stopper) no TT is possible to the round the lever was used or any earlier round anymore. TT's attempting to go to these rounds will have no effect.
Antworten:
Analyzer
Dabei wird die Vergangenheit analysiert, um die besten Vorhersagen für die Zukunft zu treffen.
BEARBEITEN : Vermeidet blaue Hebelzeiten. Nutzt die blauen Hebel effektiv. Verwendet die roten Hebel effektiver. Für die Halloween-Saison wurde die Knappheit erhöht.
EDIT: um 1 Fehler behoben.
EDIT: Verbesserte
computeWinningProbability
Funktion. Verwendet jetzt rote Hebel und blaue Hebel aggressiver.Ergebnis (seit dem 2. November):
quelle
Nostalgie
Nicht getestet, nur ein kurzer Versuch, einen Bot zu machen, der schwer zu blocken ist (weil er entscheidet, wann er den roten Hebel zieht, meistens nach dem Zufallsprinzip), aber das trifft vernünftige Entscheidungen.
Bearbeiten: Ich habe diese Regel verpasst:
Das scheint ein guter Grund zu sein, den Speicher zu nutzen. Wenn Sie sich daran erinnern, dass Sie versucht haben, eine bestimmte Runde zu absolvieren, sind Sie möglicherweise gescheitert. Versuchen Sie also nicht, die Runde erneut zu absolvieren. Habe meinen Bot bearbeitet, um dies zu vermeiden.
quelle
Orakel
Ich habe schamlos Code von Analyzer kopiert (zum Parsen des Speichers). Diese Submission versucht, frühzeitig einen blauen Hebel zu ziehen und baut dann langsam seine Führung auf. Ich denke, die Leistung dieses Bots gleicht den hässlichen Code aus :)
quelle
RegretBot
Am Ende
unseres Lebensbereuen wir unsere Fehler in der Vergangenheit und versuchen, sie zu beheben.quelle
Kleine Zehn
Little Ten multipliziert und dividiert viel durch 10, verwendet Zahlen, die ein Vielfaches von 10 sind, und geht zurück zu Runden, die ein Vielfaches von 10 sind.
Bearbeiten: Die Mechanik wurde ein wenig geändert, da die Erklärung, was passiert, wenn ein blauer Hebel gezogen wird, klarer ist. Hat auch ein bisschen nachgeglichen.
quelle
Zufällig
Die Strategie von Random ist folgende:
quelle
NoRegretsBot
quelle
Schlechter Verlierer
Dieser Bot benötigt keinen Speicher und ist überraschend gut (aber er schlägt Analyzer oder Oracle nicht).
quelle
Alte Schule
Dieser Bot tut niemals etwas, da Oldschool nicht an Zeitreisen glaubt.
quelle
Deja Vu Bot
Dieser Bot versucht zu verfolgen, wann er das Blau zieht, um zu vermeiden, dass Rot in diesen Bereich zieht. Zieht nur rote Hebel, wenn er in der Wertung deutlich zurückliegt.
quelle