Si no ha jugado golf antes, aquí hay una lista de términos relacionados con el golf que uso en esta pregunta
- Tiro , también llamado golpe : cada vez que se golpea la pelota, este es un tiro.
- Hoyo : Un campo de golf se divide en hoyos, en los cuales el objetivo es golpear una pelota de un lugar designado a otro en la menor cantidad de golpes posibles.
- Tee : donde comienzas un hoyo.
- Pin o bandera : donde terminas un hoyo
- Fairway , Rough , Water y Green : características en un campo de golf que afectan la forma en que uno juega la pelota en la vida real. (La forma en que afectan el programa se especifica a continuación)
Mañana saldré a jugar al golf, y me doy cuenta de que, a veces, tengo problemas para determinar qué palo usar para alcanzar cierto yardaje. Así que decidí escribir mis palos y sus yardas por disparo.
Primera suposición: Todos los agujeros se deben al norte de sus cajas de te.
Todos estos yardas miden las posibilidades de qué tan al norte viaja la pelota. La pelota viajará una distancia entera aleatoria entre los límites especificados para cada club (inclusive).
Como maestro de golf, ninguno de mis tiros tiene desplazamiento horizontal. Esto significa que todos mis disparos van en línea recta directamente a la bandera.
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)
Como persona que disfruta de la programación, decido que quiero modelar una ronda de golf y establecer una meta para lo bien que quiero hacerlo mañana. Sin embargo, como cualquier programador aficionado, después de diez minutos, me di por vencido y pedí ayuda sobre Stack Overflow (es broma). Aquí hay algunos datos más sobre el curso.
Segunda Asunción: Geografía del Hoyo
Todos los números que describen distancias en el curso son enteros.
Cada hoyo es una línea recta. La distancia en línea recta entre cada orificio y el pasador (el extremo del orificio) es
Length
.Las calles son segmentos con longitud definida por
flen
. El valor indicadoflen
es el rango de yardas al norte desde el tee donde se encuentra la calle.Los peligros del agua son segmentos que tienen una longitud definida por
wlen
, que tiene las mismas propiedades queflen
.El verde tiene una longitud definida por
glen
.Todas las partes del curso que no son de calle, agua o verde son ásperas.
Aquí hay una tabla que describe cada hoyo en el campo.
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
Cómo jugar golf (para este programa)
- Apunte siempre exactamente a la bandera.
- Golpee la pelota lo más cerca posible del alfiler, tratando de mantener la pelota en la calle o (preferiblemente) en el green.
- Cuando aterrizas un tiro en el agua, tu próximo tiro debe jugarse desde el mismo lugar que el tiro que cayó al agua.
- Una vez que la pelota cae en el green, solo se puede usar el putter. Si la pelota cae estrictamente a más de 5 yardas del pin, entonces lo golpeo dos veces. De lo contrario, lo puse una vez.
- Es posible golpear un tiro más allá del pin.
Puntuación
Mi puntaje en un hoyo es la cantidad de disparos que tomo, más un golpe por cada vez que aterrizo en el mar o en el agua.
El programa
Bien, esas eran muchas reglas, ahora hablemos sobre el programa.
El curso debe definirse como anteriormente en el programa , porque el curso es constante. Sin embargo, diferentes jugadores de golf tienen diferentes distancias para cada tiro, por lo que la entrada a STDIN debe ser un conjunto de rangos de yardas, dispuestos en orden creciente de número de palo y separados por comas (sin espacios en blanco).
La salida debería ser cómo "juego" la ronda de golf. El número de espera debe especificarse al comienzo de cada línea como Hole #:
donde #
está el hoyo actual. Cada tiro que no es un putt es de la forma siguiente: {club,distance of shot,condition of ball,distance to pin}
. Los detalles de la toma deben estar separados por comas pero sin espacios en blanco en el orden anterior. Los disparos en sí deben escribirse en orden de cómo se juegan y separados por un espacio. Una vez que la pelota cae en el green, el programa debe imprimir cuántos putts tomo, en el formato {# putts}
. Al final de cada línea, el número de disparos que hice en el hoyo debe estar separado de los otros disparos por un espacio e impreso como(#)
. Cada hoyo debe estar en su propia línea y escrito en orden. Finalmente, en la última (décima) línea del programa, el número total de disparos para la ronda debe imprimirse como Total: # shots
.
No hay una "estrategia" establecida que su programa deba tomar. Puede escribir un programa con cualquier estrategia que desee. Las estrategias de ejemplo incluyen maximizar el porcentaje de posibilidades de aterrizar en el green y maximizar la distancia de cada disparo hasta llegar al hoyo.
ENTRADA DE MUESTRA
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
SALIDA DE MUESTRA
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
Admito que este es un desafío bastante ambicioso para una primera publicación en CG.SE, por lo que me alegraría hablar sobre cómo mejorar este desafío en los comentarios. Gracias por tu ayuda.
fuente
0~299
yardas, verde de300~315
yardas y agua de316~330
yardas. ¿Qué club será elegido? ¿Qué pasa si el agua es reemplazada por agua?Respuestas:
Python 2.7:
4340.5 tiros promedioEsta es mi primera publicación aquí, así que tengan paciencia conmigo.
Como el póster estaba pensando en tratar esto como un desafío de programación, no como un código de golf, lo aborde como un desafío de programación. Intenté mantener mi solución y la lógica de disparo simple, pero resultó más feo ya que las cosas se complicaron rápidamente.
Mi código
Algunas cosas para pensar mientras lee: el programa crea una lista de palos usados llamados 'clubes', y una lista llamada 'distancias' que es la distancia que la pelota ha recorrido desde el tee, hlen es la longitud del hoyo, d1s es el la distancia que recorre cada disparo.
Primero defino el curso. Cada calle, el agua y la longitud verde tenían que definirse para que luego el programa pudiera verificar la condición de la pelota, por lo que agregué valores no enteros para las partes del curso que no existían.
Aquí definí la lógica principal para elegir un club. El programa intenta maximizar la distancia eligiendo el controlador para todas las longitudes mayores que la distancia máxima del conductor y elige un palo con un rango que contenga la distancia al hoyo de lo contrario. Esto requiere que el rango proporcionado por la entrada del palo sea continuo, es decir, sin espacios en la distancia de disparo. Un requisito realista ya que uno puede golpear un palo sin un backswing completo para limitar la distancia de su disparo a la distancia máxima del siguiente palo más poderoso.
A continuación, defino una función put que consiste en dos putts para todas las longitudes mayores de 5 yardas al hoyo y un putt para 5 y menos. También incluyo una opción para golpear la pelota directamente en el hoyo llamada 'chip in'.
Aquí es donde la estrategia se pone un poco cobarde. Para que sea simple y también evite quedar atrapado en un ciclo de conducción en el agua solo para dejar caer la pelota en el lugar del disparo anterior y conducir nuevamente al agua, en realidad retrocedo, golpeando la pelota hacia atrás con la cuña de arena y luego haga que el código evalúe el disparo nuevamente, esta vez con suerte disparando justo en frente del agua para que el próximo disparo pueda despejarlo. Esta estrategia es penalizada por la penalización aproximada, pero es efectiva para limpiar el agua.
Este programa cuenta el número de golpes por hoyo después de que se haya jugado ese hoyo. Agrega las penalizaciones por los disparos en bruto y las penalizaciones por golpear el agua sumando una matriz llamada agua que se agrega después de cada disparo de agua. Esto aprovecha el hecho de que la calle siempre conduce al agua o al green por cada hoyo en el campo. Tendría que cambiarse para cursos que contenían rudo en el medio de la calle.
Después de que se ejecuta el código principal, la condición observa las distancias a las que se encontraba la pelota durante el hoyo e informa la condición de la pelota. Me encontré con un problema con la condición debido a la forma en que traté golpear la pelota en el agua en el programa principal. En el programa, si la pelota fue golpeada en el agua, inmediatamente se movió de regreso al lugar donde fue golpeado. La distancia se registró después de que la pelota se movió hacia atrás, por lo que la condición de la pelota no puede ser 'agua'. Si golpea la pelota desde el tee en el hoyo 4 hacia el agua, el programa imprime la distancia que golpeó la pelota y el palo, pero la longitud hasta el hoyo permanecerá sin cambios y la condición será 'rugosa' ya que la pelota se cae a 0 distancia que está en bruto. Puede descomentar una impresión 'agua'
Aquí está la parte principal del código que carga los agujeros y juega el juego. Después de inicializar algunas condiciones, el código ejecuta 'golpe' golpeando la pelota hacia el hoyo, incluso en reversa si el hoyo fue sobrepasado, hasta que se encuentre agua o verde. Si se encuentra agua, se agrega a un contador de penalización y ejecuta el agua del programa y después de mover la pelota de regreso al lugar desde donde fue golpeada. Si se encuentra el green, se llama put y se termina el hoyo. Después de analizar las distancias y los palos para determinar la condición de cada disparo y los disparos se cuentan.
El código se ejecuta como
y la salida se ve así:
Este fue uno de los puntajes más bajos de muchos ensayos, con un puntaje absoluto más bajo de 26 en 100,000 carreras. Pero aún bajo un par típico de 34-36 incluso con 8 golpes en el hoyo 4.
Incluiré el código que usé para encontrar la distribución de juegos con los clubes especificados anteriormente.
Corriendo
da el siguiente histograma
y la media y la mediana se pueden encontrar usando
una media de aproximadamente 43 y una mediana de 41. No está mal para 9 hoyos con la optimización de disparo simple.
Ahora es todo tuyo
Continúe, copie y modifique mi programa y evalúelo usando mis herramientas para reducir el número promedio de disparos. Avíseme si hay algo que no haya tenido en cuenta o continúe y haga una versión de golf. Creo que el mejor programa sería aquel que devolviera los tiros promedio más bajos para una cantidad de entradas del club. Mi código no es la mejor opción para eso, pero pensé en poner en marcha la pelota.
Actualizar
Al cambiar la lógica del agua para que intente golpear la pelota hacia adelante una pequeña cantidad después de encontrar agua en lugar de hacia atrás si el palo anterior utilizado no era la cuña de arena, mejoró la media a 40.5 y la mediana a 39 después de probar con una millones de carreras. Mínimo de 23, máximo de 135. A veces tienes suerte, a veces no. Mira el nuevo histograma.
fuente