Wenn Sie noch nie Golf gespielt haben, finden Sie hier eine Liste der Golfbegriffe, die ich in dieser Frage verwende
- Schuss , auch Schlaganfall genannt : Jedes Mal, wenn der Ball geschlagen wird, ist dies ein Schuss.
- Loch : Ein Golfplatz ist in Löcher unterteilt, auf denen ein Ball mit möglichst wenigen Schlägen von einem bestimmten Ort zum anderen geschlagen werden soll.
- T-Stück : Wo Sie ein Loch beginnen.
- Anstecknadel oder Fahne : Wo Sie ein Loch beenden
- Fairway , Rough , Water und Green : Merkmale auf einem Golfplatz, die sich darauf auswirken, wie man den Ball im wirklichen Leben spielt. (Wie sie sich auf das Programm auswirken, ist unten angegeben)
Ich gehe morgen zum Golfspielen und finde, dass ich manchmal Probleme habe, herauszufinden, mit welchem Schläger ich eine bestimmte Lauflänge schlagen soll. Also habe ich beschlossen, meine Schläger und ihre Laufleistung pro Schuss aufzuschreiben.
Erste Annahme: Alle Löcher sind nördlich ihrer Abschlagboxen fällig.
Alle diese Meter messen die Möglichkeiten, wie weit der Ball nach Norden wandert. Der Ball legt eine zufällige, ganzzahlige Distanz zwischen den für jeden Verein (einschließlich) festgelegten Grenzen zurück.
Als Golfmeister hat keiner meiner Schläge eine horizontale Verschiebung. Dies bedeutet, dass alle meine Schüsse in einer geraden Linie direkt auf die Flagge gerichtet sind.
Club # Club Yardage
1 Driver 300-330
2 3-Wood 270-299
3 5-Wood 240-269
4 3-Iron 220-239
5 4-Iron 200-219
6 5-Iron 180-199
7 6-Iron 160-179
8 7-Iron 140-159
9 8-Iron 120-139
10 9-Iron 100-119
11 P-Wedge 80-99
12 S-Wedge 50-79
13 L-Wedge 0-49
14 Putter (only on green)
Als eine Person, die Spaß am Programmieren hat, entscheide ich mich, eine Runde Golf zu spielen und mir das Ziel zu setzen, wie gut ich morgen sein möchte. Wie jeder Hobby-Programmierer gab ich jedoch nach zehn Minuten auf und bat um Hilfe bei Stack Overflow (nur ein Scherz). Hier finden Sie weitere Daten zum Kurs.
Zweite Annahme: Lochgeographie
Alle Zahlen, die Entfernungen auf dem Kurs beschreiben, sind ganze Zahlen.
Jedes Loch ist eine gerade Linie. Der geradlinige Abstand zwischen jedem Loch und dem Stift (dem Ende des Lochs) beträgt
Length
.Fairways sind Segmente mit einer Länge von
flen
. Der angegebene Wertflen
ist der Wertebereich nördlich des Abschlags, auf dem sich das Fairway befindet.Wasserhindernisse sind Segmente, deren Länge durch definiert ist
wlen
und die die gleichen Eigenschaften haben wieflen
.Das Grün hat eine Länge definiert durch
glen
.Alle Teile der Strecke, die weder Fairway noch Wasser oder Grün sind, sind rau.
Hier ist eine Tabelle, die jedes Loch auf dem Platz beschreibt.
Hole # Length flen wlen glen
1 401 54-390 391-425
2 171 1-165 166-179
3 438 41-392 393-420 421-445
4 553 30-281,354-549 282-353 550-589
5 389 48-372 373-404
6 133 125-138
7 496 37-413 414-484 484-502
8 415 50-391 392-420
9 320 23-258 259-303 304-327
Golf spielen (für dieses Programm)
- Zielen Sie immer genau auf die Flagge.
- Schlagen Sie den Ball so nah wie möglich am Pin und versuchen Sie, den Ball auf dem Fairway oder (vorzugsweise) auf dem Grün zu halten.
- Wenn Sie einen Schuss im Wasser landen, muss Ihr nächster Schuss an derselben Stelle gespielt werden wie der Schuss, der ins Wasser ging.
- Sobald der Ball auf dem Grün landet, kann nur der Putter verwendet werden. Wenn der Ball mehr als 5 Meter vom Pin entfernt landet, putte ich zweimal. Ansonsten putte ich einmal.
- Es ist möglich, einen Schuss an der Nadel vorbei zu schießen.
Wertung
Meine Punktzahl an einem Loch ist die Anzahl der Schläge, die ich mache, plus einen Schlag für jede Landung in rauem oder im Wasser.
Das Programm
Okay, das waren viele Regeln, jetzt lass uns über das Programm sprechen.
Der Kurs sollte wie oben im Programm definiert sein , da der Kurs konstant ist. Unterschiedliche Golfer haben jedoch unterschiedliche Abstände für jeden Schlag. Daher sollte die Eingabe für STDIN eine Reihe von Wertebereichen sein, die in aufsteigender Reihenfolge der Schlägernummern angeordnet und durch Kommas getrennt sind (ohne Leerzeichen).
Die Ausgabe sollte sein, wie ich die Runde des Golfs "spiele". Die Hold-Nummer sollte am Anfang jeder Zeile angegeben werden, da sich Hole #:
dort #
die aktuelle Bohrung befindet. Jeder Schuss, der nicht ein Putt ist die folgende Form: {club,distance of shot,condition of ball,distance to pin}
. Die Details der Aufnahme sollten durch Kommas getrennt sein, aber keine Leerzeichen in der oben angegebenen Reihenfolge. Die Aufnahmen selbst sollten in der Reihenfolge geschrieben werden, in der sie gespielt und durch ein Leerzeichen getrennt werden. Sobald der Ball auf dem Grün landet, sollte das Programm drucken, wie viele Putts ich im Format nehme {# putts}
. Am Ende jeder Zeile sollte die Anzahl der Aufnahmen, die ich auf dem Loch gemacht habe, durch ein Leerzeichen von den anderen Aufnahmen getrennt und als gedruckt werden(#)
. Jedes Loch sollte in einer eigenen Linie stehen und in der richtigen Reihenfolge geschrieben sein. Schließlich sollte in der letzten (zehnten) Zeile des Programms die Gesamtzahl der Aufnahmen für die Runde als ausgedruckt werden Total: # shots
.
Es gibt keine festgelegte "Strategie", die Ihr Programm einhalten muss. Sie können ein Programm mit jeder gewünschten Strategie schreiben. Beispielstrategien umfassen das Maximieren der prozentualen Chance, auf dem Grün zu landen, und das Maximieren der Entfernung jedes Schusses bis zum Erreichen des Lochs.
MUSTER EINGANG
300-330,270-299,240-269,220-239,200-219,180-199,160-179,140-159,120-139,100-119,80-99,50-79,0-49
BEISPIELAUSGABE
Hole 1: {Driver,324,Fairway,77} {S-Wedge,70,Green,7} {Two putts} (4)
Hole 2: {6-Iron,162,Water,171} {6-Iron,168,Green,3} {One putt} (4)
Hole 3: {Driver,301,Fairway,137} {8-Iron,131,Green,6} {Two putts} (4)
Hole 4: {3-Wood,288,Water,553} {3-Wood,276,Fairway,277} {3-Wood,291,Green,14} {Two putts} (6)
Hole 5: {Driver,322,Fairway,67} {S-Wedge,62} {One putt} (3)
Hole 6: {8-Iron,120,Rough,18} {L-Wedge,10,Green,8} {Two putts} (5)
Hole 7: {Driver,325,Fairway,171] {6-Iron,170,Green,1} {One putt} (3)
Hole 8: {Driver,306,Fairway,109} {9-Iron,100,Green,9} {Two putts} (4)
Hole 9: {Driver,308,Green,12} {Two putts} (3)
Total: 36 shots
Ich gebe zu, dies ist eine ziemlich ehrgeizige Herausforderung für einen ersten Beitrag auf CG.SE, daher würde ich mich freuen, in Kommentaren darüber zu sprechen, wie diese Herausforderung verbessert werden kann. Danke für deine Hilfe.
quelle
0~299
Yards, Grün von300~315
Yards und Wasser von316~330
Yards. Welcher Verein wird ausgewählt? Was ist, wenn das Wasser durch raues ersetzt wird?Antworten:
Python 2.7:
4340,5 Aufnahmen durchschnittlichDies ist mein erster Beitrag hier, also nimm ihn mit.
Da das Poster dachte, dies als Programmieraufgabe und nicht als Codegolf zu behandeln, ging ich es eher als Programmieraufgabe an. Ich habe versucht, meine Lösung zu halten und die Logik einfach zu halten, aber es stellte sich als hässlicher heraus, da die Dinge schnell kompliziert wurden.
Mein Code
Einige Dinge, die Sie beim Lesen beachten sollten: Das Programm erstellt eine Liste der verwendeten Schläger mit der Bezeichnung "Schläger" und eine Liste mit der Bezeichnung "Entfernungen". Dabei handelt es sich um die Entfernung, die der Ball vom Abschlag zurückgelegt hat Entfernung, die jeder Schuss zurücklegt.
Zuerst definiere ich den Kurs. Jedes Fairway, Wasser und jede Grünlänge mussten definiert werden, damit das Programm später den Zustand des Balls überprüfen konnte. Daher habe ich nicht ganzzahlige Werte für die Teile des Kurses hinzugefügt, die nicht vorhanden waren.
Hier habe ich die Hauptlogik für die Auswahl eines Clubs definiert. Das Programm versucht, den Abstand zu maximieren, indem der Fahrer für alle Längen ausgewählt wird, die größer als der maximale Abstand sind, und wählt einen Schläger mit einem Bereich, der den Abstand zum Loch enthält. Dies setzt voraus, dass die vom Schlägereingang bereitgestellte Reichweite kontinuierlich ist, dh keine Lücken in der Schussentfernung. Eine realistische Anforderung, da man einen Schläger ohne vollen Rückschlag treffen kann, um die Schlagweite auf die maximale Schlagweite des nächststärkeren Schlägers zu begrenzen.
Als nächstes definiere ich eine Put-Funktion, die zwei Putts für alle Längen von mehr als 5 Metern zum Loch und einen Putt für 5 und weniger ausführt. Ich schließe auch eine Option ein, um den Ball direkt in das Loch zu schlagen, das als "Chip-In" bezeichnet wird.
Hier wird die Strategie etwas flippig. Um es einfach zu halten und auch zu verhindern, dass ich in einer Schleife stecke und ins Wasser fahre, nur um den Ball an der Stelle des vorherigen Schusses fallen zu lassen und wieder ins Wasser zu fahren, gehe ich zurück und schlage den Ball mit dem Sandkeil und zurück Lassen Sie dann den Code den Schuss dieses Mal erneut auswerten und hoffentlich direkt vor dem Wasser schießen, damit der nächste Schuss ihn klären kann. Diese Strategie wird durch die grobe Strafe bestraft, ist jedoch für die Reinigung von Wasser wirksam.
Dieses Programm zählt die Anzahl der Schläge pro Loch, nachdem dieses Loch gespielt wurde. Es addiert die Strafen für die Schläge im Rough und die Strafen für das Schlagen ins Wasser, indem es ein Array namens water summiert, das nach jedem Wasserschuss angehängt wird. Dies nutzt die Tatsache aus, dass das Fairway für jedes Loch auf dem Platz immer zum Wasser oder zum Grün führt. Es müsste für Kurse geändert werden, die rau in der Mitte des Fairways enthalten.
Nachdem der Hauptcode ausgeführt wurde, werden die Entfernungen des Balls während des Lochs überprüft und der Zustand des Balls gemeldet. Ich bin auf ein Problem mit einer Bedingung gestoßen, weil ich im Hauptprogramm behandelt habe, wie ich den Ball ins Wasser geschlagen habe. Wurde der Ball im Programm ins Wasser geschlagen, wurde er sofort an die Stelle zurückbewegt, an der der Schuss geschlagen wurde. Die Distanz wurde aufgezeichnet, nachdem der Ball zurückbewegt wurde, sodass der Zustand des Balls nicht "Wasser" sein kann. Wenn Sie den Ball vom Abschlag auf Loch 4 ins Wasser schlagen, druckt das Programm die Distanz, über die Sie den Ball und den Schläger getroffen haben, aber die Länge bis zum Loch bleibt unverändert, und der Zustand ist "rau", da der Ball auf "fallen gelassen" wird 0 Entfernung, die in der rauen ist. Sie können einen Druck "Wasser" auskommentieren
Hier ist der Hauptteil des Codes, der die Löcher lädt und das Spiel spielt. Nach dem Initialisieren einiger Bedingungen führt der Code einen Schlag aus, der den Ball in Richtung des Lochs schlägt, einschließlich der Umkehrung, wenn das Loch überschritten wurde, bis entweder Wasser oder Grün angetroffen wird. Wenn Wasser angetroffen wird, addiert es sich zu einem Strafzähler und führt das Programmwasser aus, nachdem der Ball an die Stelle zurückgebracht wurde, von der aus er getroffen wurde. Wenn das Grün angetroffen wird, wird Put aufgerufen und das Loch wird beendet. Nachdem die Distanzen und Schläger analysiert wurden, um den Zustand jedes Schusses zu bestimmen, werden die Schüsse gezählt.
Der Code wird wie folgt ausgeführt
und das sieht so aus:
Dies war einer der niedrigsten Werte in vielen Versuchen, mit einem absoluten niedrigsten von 26 in 100.000 Läufen. Aber immer noch unter einem typischen Par von 34-36, auch mit 8 Schlägen auf Loch 4.
Ich füge den Code ein, mit dem ich die Verteilung der Spiele mit den oben angegebenen Vereinen ermittelt habe.
Laufen
gibt das folgende Histogramm
und der Mittelwert und der Median können mit ermittelt werden
Ein Mittelwert von ungefähr 43 und ein Median von 41. Nicht schlecht für 9 Löcher mit einfacher Schussoptimierung.
Es liegt jetzt ganz bei Ihnen
Kopieren und optimieren Sie mein Programm und werten Sie es mit meinen Tools aus, um die durchschnittliche Anzahl der Aufnahmen zu verringern. Lassen Sie mich wissen, ob es ein Szenario gibt, das ich nicht berücksichtigt habe, oder machen Sie eine Golfversion. Ich denke, dass das beste Programm eines ist, das die niedrigsten Durchschnittsschläge für eine Reihe von Vereinseinsätzen liefert. Mein Code ist nicht die beste Option dafür, aber ich dachte, ich würde den Ball ins Rollen bringen.
Aktualisieren
Indem die Wasserlogik so geändert wurde, dass der Ball nach dem Auftreffen auf Wasser ein kleines Stück nach vorne und nicht nach hinten geschlagen wird, wenn der vorherige Schläger nicht der Sandkeil war, verbesserte sich der Mittelwert auf 40,5 und der Median auf 39 nach dem Testen mit einem Millionen Läufe. Mindestens 23, höchstens 135. Manchmal hat man Glück, manchmal nicht. Schauen Sie sich das neue Histogramm an.
quelle