Jeśli wcześniej nie grałeś w golfa, oto lista terminów związanych z golfem, których używam w tym pytaniu
- Strzał , zwany także uderzeniem : za każdym razem, gdy piłka zostaje uderzona, jest to strzał.
- Dziura : pole golfowe jest podzielone na dziury, w których celem jest uderzenie piłki z jednego wyznaczonego miejsca do drugiego w jak najmniejszej liczbie rzutów.
- Tee : Gdzie zaczynasz dołek.
- Przypinka lub flaga : Gdzie kończysz dziurę
- Fairway , Rough , Water i Green : Funkcje na polu golfowym, które wpływają na sposób gry w piłkę w prawdziwym życiu. (Ich wpływ na program jest określony poniżej)
Jutro idę grać w golfa i czasami mam problem z ustaleniem, jakiego klubu użyć, aby osiągnąć określony dystans. Postanowiłem więc zapisać moje kluby i ich dystanse na strzał.
Pierwsze założenie: wszystkie dziury są na północ od ich tee boxów.
Wszystkie te odcinki mierzą możliwości, jak daleko piłka podróżuje na północ. Piłka pokona losową liczbę całkowitą między granicami określonymi dla każdego klubu (włącznie).
Jako mistrz golfisty żadne z moich ujęć nie ma przesunięcia w poziomie. Oznacza to, że wszystkie moje strzały padają w linii prostej bezpośrednio na flagę.
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)
Jako osoba, która lubi programować, postanawiam, że chcę wymodelować rundę golfa i wyznaczyć sobie cel, jak dobrze chcę jutro. Jednak, jak każdy programista amator, po dziesięciu minutach poddałem się i poprosiłem o pomoc w stosie przepełnienia (tylko żartuję). Oto kilka innych danych na temat kursu.
Drugie założenie: Geografia otworów
Wszystkie liczby opisujące odległości na kursie są liczbami całkowitymi.
Każdy otwór jest linią prostą. Odległość w linii prostej między każdym otworem a sworzniem (koniec otworu) wynosi
Length
.Tor wodny to odcinek o długości określonej przez
flen
. Podana wartośćflen
to zakres odcinków na północ od tee, na której znajduje się tor wodny.Zagrożenia wodne to segmenty, które mają zdefiniowaną długość
wlen
, która ma takie same właściwości jakflen
.Kolor zielony ma długość określoną przez
glen
.Wszystkie części pola, które nie są torami wodnymi, wodnymi lub zielonymi, są nierówne.
Oto tabela opisująca każdą dziurę na kursie.
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
Jak grać w golfa (dla tego programu)
- Zawsze celuj dokładnie w flagę.
- Uderz piłkę jak najbliżej sworznia, starając się utrzymać piłkę na torze wodnym lub (najlepiej) na zieleni.
- Kiedy wylądujesz w wodzie, twój następny strzał musi zostać rozegrany z tego samego miejsca, co strzał, który trafił do wody.
- Gdy piłka wyląduje na zieleni, można użyć tylko miotacza. Jeśli piłka wyląduje dokładnie ponad 5 jardów od sworznia, wtedy uderzam dwa razy. W przeciwnym razie raz postawię.
- Możliwe jest trafienie za pinezkę.
Punktacja
Mój wynik na dołku to liczba wykonanych przeze mnie strzałów plus jedno uderzenie za każdym razem, gdy ląduję na nierówności lub w wodzie.
Program
Okej, to było dużo zasad, teraz porozmawiajmy o programie.
Kurs należy zdefiniować jak wyżej w programie , ponieważ kurs jest stały. Różni golfiści mają jednak różne odległości dla każdego strzału, więc wejściem do STDIN powinien być zestaw zakresów metrażów, ułożonych w kolejności numerów klubów i oddzielonych przecinkami (bez białych znaków).
Efektem powinno być to, jak „gram” w golfa. Numer wstrzymania należy podać na początku każdej linii, Hole #:
gdzie #
jest bieżący otwór. Każdy strzał, który nie jest putt ma postać następującą:{club,distance of shot,condition of ball,distance to pin}
. Szczegóły ujęcia powinny być oddzielone przecinkami, ale bez spacji w powyższej kolejności. Same ujęcia powinny być napisane w kolejności ich odtwarzania i oddzielone spacją. Gdy piłka wyląduje na zielonym, program powinien wydrukować liczbę puttów, które wezmę, w formacie {# putts}
. Na końcu każdej linii liczba zdjęć, które wykonałem na dołku, powinna być oddzielona spacją od innych zdjęć i wydrukowana jako(#)
. Każda dziura powinna znajdować się w osobnej linii i pisać w kolejności. Wreszcie w ostatnim (dziesiątym) wierszu programu należy wydrukować całkowitą liczbę strzałów w rundzie Total: # shots
.
Nie ma określonej „strategii”, którą Twój program musi podjąć. Możesz napisać program z dowolną strategią. Przykładowe strategie obejmują maksymalizację procentowej szansy na lądowanie na zielonym polu i maksymalizację odległości każdego strzału, aż do dołka.
PRZYKŁADOWE WEJŚCIE
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
PRZYKŁADOWA WYDAJNOŚĆ
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
Przyznaję, że jest to dość ambitne wyzwanie dla pierwszego postu na CG.SE, więc chętnie porozmawiam o tym, jak poprawić to wyzwanie w komentarzach. Dziękuję za pomoc
źródło
0~299
jardów, zielony od300~315
jardów i woda z316~330
jardów. Który klub zostanie wybrany? Co jeśli woda zostanie zastąpiona przez szorstką?Odpowiedzi:
Python 2.7:
43 Średnia40,5 strzałówTo jest mój pierwszy post tutaj, więc proszę o wyrozumiałość.
Ponieważ plakat myślał o traktowaniu tego jak wyzwania programistycznego, a nie golfa kodowego, podniosłem to jako wyzwanie programistyczne. Starałem się, aby moje rozwiązanie i logika były proste, ale okazało się to bardziej brzydkie, ponieważ sprawy szybko się skomplikowały.
Mój kod
Kilka rzeczy do przemyślenia podczas czytania: program tworzy listę używanych pałek zwanych „pałkami” i listę zwaną „odległościami”, czyli odległością, jaką piłka pokonała od tee, hlen jest długością dołka, d1s jest odległość, jaką pokonuje każdy strzał.
Najpierw określam kurs. Każda toru wodnego, wody i długości zieleni musiała zostać zdefiniowana, aby później program mógł sprawdzić stan kuli, dlatego dodałem wartości nie całkowite dla części kursu, które nie istniały.
Tutaj zdefiniowałem główną logikę wyboru klubu. Program próbuje zmaksymalizować odległość, wybierając kierowcę dla wszystkich długości większych niż maksymalna odległość kierowcy i wybiera kij o zasięgu, który zawiera odległość do dołka w przeciwnym razie. Wymaga to ciągłego zasięgu zapewnianego przez sygnał pałki, tzn. Braku odstępów w odległości strzału. Realistyczny wymóg, ponieważ można uderzyć w kij bez pełnego backswinga, aby ograniczyć odległość strzału do maksymalnej odległości następnego najsilniejszego kija.
Następnie definiuję funkcję put, w której dwa putty dla wszystkich długości większych niż 5 jardów do otworu i jeden putt dla 5 i mniej. Mam również opcję uderzenia piłki bezpośrednio w otwór o nazwie „chip in”.
Tutaj strategia staje się trochę funky. Aby zachować prostotę, a także zapobiec utknięciu w pętli wbijania się w wodę tylko po to, aby upuścić piłkę w miejscu poprzedniego strzału i ponownie wjechać do wody, faktycznie cofam się, uderzając piłkę do tyłu za pomocą klina piasku i a następnie niech kod ponownie oceni strzał, tym razem strzelając tuż nad wodą, aby następny strzał mógł go usunąć. Ta strategia jest karana surową karą, ale jest skuteczna w oczyszczaniu wody.
Ten program zlicza liczbę uderzeń na dołek po odtworzeniu tego dołka. Dodaje kary za strzały z grubsza i dodaje kary za uderzenie w wodę, sumując tablicę zwaną wodą, która jest dodawana po każdym strzale z wody. Wykorzystuje to fakt, że tor wodny zawsze prowadzi do wody lub zieleni na każdą dziurę w trasie. Trzeba by to zmienić w przypadku kursów, które zawierały nierówne warunki na środku toru wodnego.
Po uruchomieniu głównego kodu warunek sprawdza odległości, na których znajdowała się piłka podczas dołka i zgłasza stan piłki. Natknąłem się na jeden problem z warunkiem, ponieważ traktowałem uderzanie piłki do wody w głównym programie. W programie, jeśli piłka została trafiona w wodę, natychmiast została przeniesiona z powrotem do miejsca, w którym uderzono. Odległość została zapisana po cofnięciu piłki, więc stan piłki nie może być „wodny”. Jeśli uderzysz piłkę z tee na otworze 4 do wody, program wydrukuje odległość uderzenia piłki i kija, ale długość dołka pozostanie niezmieniona, a warunek będzie „szorstki”, ponieważ piłka upuszczona jest na 0 odległość, która jest nierówna. Możesz odkomentować nadruk „woda”
Oto główna część kodu, która ładuje dziury i gra. Po zainicjowaniu niektórych warunków kod uruchamia „uderzenie” uderzając piłkę w kierunku dołka, w tym odwrotnie, jeśli otwór został przekroczony, aż napotka wodę lub zieleń. Jeśli napotka się wodę, dodaje się do licznika kar i uruchamia wodę z programu, a po przesunięciu piłki z powrotem do miejsca, z którego została trafiona. W przypadku napotkania zieleni put jest wywoływany, a dziura zostaje zakończona. Po przeanalizowaniu odległości i maczug, aby określić stan każdego strzału, a strzały są wyliczane.
Kod jest uruchamiany jak
i wygląda to tak:
Był to jeden z najniższych wyników wielu prób, z absolutnie najniższym wynikiem 26 na 100 000 przebiegów. Ale nadal poniżej typowej wartości 34-36, nawet przy 8 uderzeniach w otworze 4.
Dołączę kod, którego użyłem do znalezienia dystrybucji gier z wyżej wymienionych klubów.
Bieganie
daje następujący histogram
a średnią i medianę można znaleźć za pomocą
średnio około 43 i mediana 41. Nieźle jak na 9 dołków z prostą optymalizacją strzału.
Teraz wszystko jest twoje
Śmiało, skopiuj i popraw mój program i oceń go za pomocą moich narzędzi, aby obniżyć średnią liczbę zdjęć. Daj mi znać, jeśli istnieje jakikolwiek scenariusz, którego nie wziąłem pod uwagę ani nie przygotowałem wersji golfowej. Myślę, że najlepszym programem byłby ten, który zwrócił najniższą średnią liczbę strzałów dla wielu wkładów klubowych. Mój kod nie jest najlepszą opcją do tego, ale myślałem, że zacznę grać.
Aktualizacja
Zmieniając logikę wody, aby próbowała uderzyć piłkę do przodu niewielką ilością po napotkaniu wody zamiast do tyłu, jeśli poprzedni używany kij nie był klinem piasku, poprawiła średnią do 40,5 i medianę do 39 po testowaniu z jednym milion biegów. Minimum 23, maksimum 135. Czasami masz szczęście, a czasem nie. Sprawdź nowy histogram.
źródło