Jeder Spieler hat eine Nummer. Kann deins am weitesten von allen entfernt sein?
Bedarf
Schreiben Sie eine Java-, Python 2- oder Ruby-Funktion mit dem Namen choose()
, die drei Argumente akzeptiert:
- eine ganze Zahl - die Anzahl der bereits abgeschlossenen Runden
- eine ganze Zahl - die Anzahl der Spieler
- eine Reihe von Zeichenfolgen - die Ergebnisse jeder vorherigen Runde
- Jede Zeichenfolge ist eine durch Leerzeichen getrennte Liste von Ganzzahlen, die vom niedrigsten zum höchsten Wert sortiert sind
Zum Beispiel choose(2, 4, ["4 93 93 174", "1 84 234 555"])
bedeutet:
- Es gab bereits zwei Runden (dies ist die dritte Runde)
- Es gibt insgesamt vier Spieler
- In der ersten Runde wurden die Zahlen 4, 93, 93, 174 gewählt
- In der zweiten Runde wurden die Zahlen 1, 84, 234, 555 gewählt
Sie müssen eine ganze Zahl von 1 bis 999 (einschließlich) zurückgeben.
Für jeden anderen Spieler ist Ihre Punktzahl die Quadratwurzel des Abstandes zwischen Ihrer und ihrer Zahl. Ihre Punktzahl für die Runde ist die Summe aller dieser Punkte.
Es werden 100 Runden gespielt. Die höchste Gesamtpunktzahl gewinnt!
Regeln
- Ihr Code verwendet möglicherweise keine E / A, einschließlich Konsole, Dateien, Netzwerk usw.
- Sie dürfen weder das Steuerungsprogramm noch andere Spieler stören.
- Programme, die gegen die oben genannten Regeln verstoßen, werden ausgeschlossen.
- Jeder Aufruf einer Funktion sollte auf meinem Computer (Intel Core i5 2450M mit 8 GB RAM) weniger als fünf Sekunden dauern.
- Wenn ein Programm eine Ausnahme auslöst oder einen ungültigen Wert zurückgibt, wird es so behandelt, als ob es 1 zurückgibt.
- Jeder Benutzer darf höchstens ein Programm einreichen.
Sonstiges
- Das Steuerungsprogramm ist auf GitHub .
- Es gibt drei eingebaute Spieler. Sie können in dieser Antwort gefunden werden .
- Der Gewinner wird am 28. Januar ermittelt.
Bestenliste
Der Gewinner ist Conservator .
Lobende Erwähnung an Gustav , den Spieler mit der höchsten Punktzahl und einer nicht konstanten Strategie.
- Konservator - 36226
- Hoch - 36115
- FloorHugger - 35880
- NumberOne - 35791
- Overestimator - 35791
- Gustav - 35484
- Historiker - 35201
- Sampler - 34960
- Inkrementierer - 34351
- JumpRightIn - 34074
- Vickrey - 34020
- Teenager - 33907
- Randu - 33891
- Gewichtheber - 33682
- Middleman - 33647
- BounceInwards - 33529
- NastyMathematician - 33292
- Jumper - 33244
- Nachahmer - 33049
Die vollständigen Ergebnisse finden Sie hier . (Ich empfehle, den Zeilenumbruch zu deaktivieren.)
quelle
Antworten:
Python, Konservator
Da jede Ausnahme 1 wirft, bleibt sie so weit wie möglich davon entfernt. Macht sein Vermögen auf Kosten der Schwachen.
Witzige Tatsache: Ich dachte darüber nach, es zu verbessern, konnte aber keinen besseren Weg finden, als mich nur in einer Ecke zu verstecken.
quelle
Nummer eins, Java
Der Name erklärt dies vollständig.
quelle
Python, AncientHistorian
Ist der festen Überzeugung, dass die Zukunft genau wie die Vergangenheit sein wird, glaubt jedoch, dass die letzte Runde zu aktuell ist, um noch nicht abgeschlossen zu sein. Sie durchläuft also nur 1 - 999 und wählt aus, welche der vorherigen Runden mit Ausnahme der letzten die besten gewesen wären. Die ersten 2 Runden bringen 500 zurück.
quelle
Python, Vickrey
Erstellt eine Liste mit häufig gespielten Zahlen, setzt voraus, dass alle anderen optimal spielen, und entscheidet sich für die zweite beste Wahl die Liste gegeben.
Wenn zum Beispiel die häufigsten Zahlen sind
[1, 990, 999]
, fügt Vickrey das optimale Spiel 200 ein, um es zu geben[1, 200, 990, 999]
, und wählt dann die beste Option für das neue Array aus (das ist 556).quelle
Java, Overestimator
Wie der Name schon sagt, geht dieses Programm davon aus, dass alle anderen Programme versuchen werden, "gut" zu spielen, indem sie die beste Antwort basierend auf der letzten Runde auswählen. Daher wählt dieser "Überschätzer" immer die schlechteste Position basierend auf der vorherigen Runde.
quelle
Java - Gewichtheber
Durchläuft 1-999, um herauszufinden, welches für jede Runde das Beste ist. Wiegt sie nach Aktualität (die letzten Runden haben mehr Gewicht) und gibt die beste Gesamtschätzung zurück. Wenn sich später Muster bilden, können diese hoffentlich aufgreifen.
Edit: Jetzt mit + Inf% mehr Rekursion! Nicht in der Lage zu sein, zu speichern oder zu sehen, was Sie in früheren Runden ausgewählt haben, ist ein Hindernis. Wenn Sie Ihre eigenen Eingaben berücksichtigen, werden Sie durcheinander gebracht, wenn Sie versuchen, herauszufinden, was andere tun werden. Also, lasst es uns berechnen! Dies wird nun wiederkehren, um herauszufinden, was es in der vorherigen Runde gewählt hat, und dies ignorieren, wenn der nächste Zug berechnet wird.
Beachten Sie, dass es nur seine eigenen Eingaben aus der letzten Runde wirklich ignoriert, aber da diese am höchsten gewichtet sind, scheint es in Ordnung zu funktionieren. Dies könnte mit ein bisschen mehr Arbeit behoben werden, aber ich werde auf die Bestenliste warten, um zu sehen, ob sie benötigt wird.
quelle
Ruby, Nachahmer
Gibt einfach die Zahl zurück, die beim letzten Mal gewonnen wurde.
quelle
Ruby, JumpRightIn
Es ist wahrscheinlich die einfachste Strategie. Es findet die größte Lücke in der letzten Runde und wählt die Zahl genau in der Mitte dieser Lücke.
quelle
Gustav (Python 2)
Dies ist eine ziemlich direkte Metastrategie , die schamlos von einer meiner alten Antworten in einer ähnlichen KotH-Herausforderung kopiert wurde. Es werden ein paar einfache Strategien betrachtet, wie sie sich in allen vorherigen Runden entwickelt hätten, und dann die höchste Punktzahl für die nächste Runde.
Mir ist jetzt klar, dass der Algorithmus noch einige Fehler aufweist. ZB könnte es "sich selbst jagen", weil es seine eigenen Züge nicht von denen der Gegner unterscheidet. Ich lasse es aber erstmal so.
quelle
Python, Randu
Zahlen, die vom schlechtesten Zufallsgenerator aller Zeiten ausgewählt wurden .
quelle
Die folgenden drei Programme sind integriert.
Hoch (Rubin)
Inkrementierer (Java)
FloorHugger (Python)
quelle
Python, Sampler
Wählen Sie aus der Liste der Orte den aus, der von den zuletzt verwendeten Zahlen am weitesten entfernt ist, und ignorieren Sie dabei den vorherigen Zug.
quelle
Java, BounceInwards
Ab 1 nähert es sich allmählich dem Wert 500, während zwischen der höheren und der niedrigeren Option gewechselt wird.
quelle
NastyMathematician (Java)
Untersucht die letzten beiden Runden (wenn die besten Zahlen 70 und 80 waren, wird 90 ausgegeben). Es ist böse, weil es versucht, so viele Zahlen wie möglich zu sammeln, um gegen seine Gegner zu gewinnen.
quelle
Python - Ich möchte nicht an einen Namen denken ...
Wenn der Durchschnitt der in den letzten Runden gewählten Zahlen weniger als 500 beträgt, werden 999 ausgewählt. Andernfalls wird 1 ausgewählt.
quelle
Python, Middleman (basierend auf Conservator von @clabacchio)
Nachdem ich gemerkt hatte, dass die obere Kante hoch abschneidet (und die untere Kante übertrifft), fragte ich mich, ob es etwas Schlimmeres geben könnte, als nur in der Mitte hängen zu bleiben.
quelle
Jumper (Rubin)
Wechselt zwischen unten, Mitte und oben. (5.500.995)
quelle