Dies ist das zweite in einer Reihe von Rätseln, die ich jeden Montag um Mitternacht PST veröffentlichen werde. Das erste Puzzle befindet sich hier .
Kontext:
Ein zurückgezogener Milliardär hat eine Spielshow ins Leben gerufen, um die besten und intelligentesten Programmierer der Welt anzulocken. Montags um Mitternacht wählt er aus einem Pool von Bewerbern eine Person als Bewerber der Woche aus und stellt ihnen ein Spiel zur Verfügung. Sie sind der glückliche Kandidat dieser Woche!
Das Spiel dieser Woche:
Der Host bietet Ihnen API-Zugriff auf einen Stapel von 10.000 digitalen Umschlägen. Diese Umschläge sind nach dem Zufallsprinzip sortiert und enthalten einen Dollarwert zwischen 1 und 10.000 US-Dollar (keine zwei Umschläge enthalten denselben Dollarwert).
Sie haben 4 Befehle zur Verfügung:
Read (): Lesen Sie die Dollarzahl im Umschlag oben auf dem Stapel.
Take (): Fügen Sie die Dollar-Zahl in den Umschlag Ihrer Game-Show-Brieftasche hinzu und legen Sie den Umschlag vom Stapel.
Pass (): Nehmen Sie den Umschlag oben auf dem Stapel ab.
Oracle (M): Gibt den Mittelwert der nächsten M Umschläge im Stapel zurück, ohne denjenigen, den Sie aktuell lesen können ().
Die Regeln:
Wenn Sie Pass () für einen Umschlag verwenden, ist das darin enthaltene Geld für immer verloren.
Wenn Sie Take () für einen Umschlag verwenden, der $ X enthält, dürfen Sie Take () von diesem Punkt an niemals für einen Umschlag verwenden, der <$ X enthält. Nehmen Sie () auf einen dieser Umschläge, um Ihrem Portemonnaie $ 0 hinzuzufügen.
Wenn Sie in Runde T Oracle (M) verwenden, werden die Umschläge T + 1 bis T + M zurückgegeben. Oracle () ist bis zum Turn T + M deaktiviert.
Schreiben Sie einen Algorithmus, der das Spiel mit dem maximalen Geldbetrag beendet.
Wenn Sie Ihren Algorithmus in Python schreiben, können Sie diesen Controller von @Maltysen verwenden: https://gist.github.com/livinginformation/70ae3f2a57ecba4387b5
Anmerkungen 1: "Maximal" bedeutet in diesem Fall den Medianwert in Ihrer Brieftasche, nachdem N> = 1000 ausgeführt wurde. Ich gehe davon aus, dass der Medianwert für einen gegebenen Algorithmus konvergiert, wenn N auf unendlich ansteigt, obwohl ich mich gerne als falsch erweisen würde. Versuchen Sie stattdessen, den Mittelwert zu maximieren, aber ich habe das Gefühl, dass der Mittelwert mit größerer Wahrscheinlichkeit von einem kleinen N abgelöst wird als der Median.
Anmerkung 2: Da hier alle Lösungen für den vorherigen Teil dieses Puzzles gültig sind, hat das erneute Posten wenig Wert. Nur algorithmische Verbesserungen früherer Rätsel werden für Teil II berücksichtigt.
Bearbeiten: Die Preisbedingung wurde im Lichte dieses Beitrags auf Meta entfernt.
quelle
M
Werte ermitteln, aus denen Sie auswählen könnenM
.Antworten:
Groovy
$ 713337$ 817829$ 818227Bootstrap-Code:
Algorithmus
Ich vergleiche die verbleibenden Werte mit möglichen Werten. Dieses Skript ist nicht schnell (dauert 1 Minute pro 1000x Simulationen) ... aber es führt die Simulationen gleichzeitig durch.
Ich habe keine Ahnung, warum mein Algorithmus funktioniert, aber es war nur Versuch und Irrtum: mathematische Operationen zusammenfassen und die Konstanten manipulieren. Ich habe es 5000x für die aktuelle Punktzahl ausgeführt, um die Schwankungen der Punktzahl zu verringern (+/- $ 4000, abhängig von der Anzahl der Iterationen).
Auch ohne das Orakel am Ende sollte es die Lösung von @orlp für das vorherige Rätsel (kaum) schlagen .
quelle
C # - $ 803.603 jetzt -> $ 804.760 (mit Orakel)
Bootstrap-Code
Spielcode:
Guthaben gehört Reto Koradi ( /codegolf//a/54181/30910 )
Edit: Grundsätzliche Verwendung von Oracle implementiert. Wenn das nächste Orakel über dem zu verwendenden Schwellenwert liegt, erweitern Sie den aktuellen Umschlag auf den Index des Oracle-Index. Das kommt nicht oft vor, aber ES IST eine Verbesserung ;-)
quelle
Python - 74112 US-Dollar
Nur nehmen, wenn der aktuelle Wert kleiner als der nächste Wert ist (dh Sie können beide nehmen).
Python - (berechnet immer noch den Mittelwert)
Die Berechnung dieser Antwort dauert SEHR LANG. Es erreicht rund 670.000 $ . Ich erinnere mich an jeden Umschlag, den ich gesehen habe. Jedes Mal, wenn ich eine Entscheidung treffen muss, erstelle ich zwei Listen mit verbleibenden Umschlägen, die ich möglicherweise zu meiner Brieftasche hinzufügen könnte, wenn ich den aktuellen Umschlag nehme oder ihn lasse.
Ich habe den Code nicht optimiert.
Und init_game startet so:
quelle
C # - $ 780.176
Überprüfen Sie, ob der nächste Wert innerhalb der unteren 5% aller verbleibenden Werte liegt. Entspanne dich, wenn wir am Ende sind.
Und meine Spielklasse, sehr hässlich, validiert nicht einmal, ob Orakel erlaubt ist, aber da ich nur Oracle (1) verwende, sollte das kein Problem sein.
quelle
Java, 804.991 US-Dollar
Das Ergebnis stammt aus 1001 Runden. Es ist wahrscheinlich zu eng, zwischen dieser Antwort und der von Stephan Schinkel zu sprechen .
Dies basiert auf meiner Antwort in der vorherigen Herausforderung, da dieselbe entropiebasierte Berechnung zur Schätzung der Auszahlungen verwendet wird. Der Hauptunterschied besteht darin, dass nur noch paarweise Briefumschläge (1 & 2, dann 3 & 4 usw.) eingelegt werden und die möglichen Kombinationen von Take-Take, Take-Pass, Pass-Take usw. betrachtet werden Genau geschätzte Punktzahl, wenn die Anzahl der gültigen Umschläge sehr gering ist.
Der "Wrapper", den ich geschrieben habe, ist kein echter Wrapper, er gibt nur paarweise Umschläge, anstatt
Oracle(1)
jede zweite Runde eine Funktion aufzurufen .Insgesamt würde ich sagen, dass dieser Bot trotz der gestiegenen Komplexität nicht besser ist als mein vorheriger.
Spieler
Regler
Bitcoin-Adresse: 1BVBs9ZEP8YY4EpV868nxi2R23YfL7hdMq
quelle
Python 3 - $ 615570
Benutzt eigentlich nicht das Orakel ... Eh :)
Erstellt eine Liste aller vorherigen Umschläge und überprüft, ob der aktuelle Umschlag in Schritten von 10 Umschlägen kleiner als die Anzahl der vorherigen Umschläge ist.
quelle
Python, 87, 424
Hier ist ein einfacher Algorithmus, die glückliche Sieben.
Grundsätzlich konvertiert es read () in einen String und prüft, ob eine Sieben drin ist. Wenn ja, wird der Umschlag genommen. Wenn nicht, geht es vorbei.
Es liegt im Durchschnitt bei 81.000, ich habe den Überblick nicht behalten.
quelle