Dada una lista de yardas de hoyo, tamaños verdes, un ángulo de corte y una distancia máxima, calcule una puntuación de golf .
Supuestos
- La tierra es plana
- Todos los greens son circulares.
- El ángulo de corte estará entre -45 y 45 grados y se dará en grados
- Todas las distancias en la misma métrica (yardas o metros, no importa)
- Sin límites, obstrucciones o doglegs.
- La puntuación máxima en cualquier hoyo es 8
- Todos los disparos recorren la menor distancia máxima o la distancia al hoyo, en una dirección definida por el ángulo del hoyo más el ángulo de corte.
- La distancia se mide como la línea recta o la distancia euclidiana entre el punto inicial y el punto final.
- La distancia máxima y el ángulo de corte son los mismos para todos los disparos en todos los agujeros
- El golfista siempre dos putts una vez en el green (o exactamente en el borde del green).
Ejemplo
Miremos al pirata informático del caso de prueba # 5 a continuación para el hoyo # 2. El hacker puede golpear la pelota 320 yardas, pero siempre corta 30 grados. Si suponemos sin pérdida de generalidad que el tee box está en {0,0} y el green está en {497,0}, entonces golpeará los tiros a los siguientes puntos, llegando al green con el 7 ° tiro:
{{0.,0.},{277.128,-160.},{547.543,-131.372},{569.457,7.67088},{502.872,37.2564},{479.159,7.92741},{490.646,-7.85868},{500.078,-4.22987}}
En este punto, su puntaje sería 9 debido a los dos putts requeridos, por lo que el puntaje final para él se limita a 8, según los supuestos.
Casos de prueba
Todos los casos de prueba tienen campos estándar de 18 hoyos.
Case#1
{MaxDistance->280,SliceAngle->10,HoleDistances->{181,368,161,416,158,526,377,427,509,148,405,443,510,494,396,388,483,172},GreenDiameters->{26,18,17,23,27,23,21,23,25,21,19,24,21,23,25,24,22,22}}
Scores:
{4,5,4,5,4,5,5,5,5,4,5,5,5,5,5,5,5,4}
Output: 85
Case#2 (same course as Test Case #1, shorter more accurate golfer)
{MaxDistance->180,SliceAngle->5,HoleDistances->{181,368,161,416,158,526,377,427,509,148,405,443,510,494,396,388,483,172},GreenDiameters->{26,18,17,23,27,23,21,23,25,21,19,24,21,23,25,24,22,22}}
Scores:
{4,5,4,5,4,6,5,5,6,4,5,5,6,6,5,5,5,4}
Output: 89
Case#3 (Same golfer as test case #1, shorter course)
{MaxDistance->280,SliceAngle->10,HoleDistances->{147,497,110,528,409,118,196,154,134,514,374,491,131,138,523,478,481,494},GreenDiameters->{32,16,36,25,32,20,30,30,33,29,25,26,26,25,33,28,21,28}}
Scores:
{4,5,4,5,5,4,4,4,4,5,5,5,4,4,5,5,5,5}
Output: 82
Case#4 (Same course as test case #3)
{MaxDistance->180,SliceAngle->5,HoleDistances->{147,497,110,528,409,118,196,154,134,514,374,491,131,138,523,478,481,494},GreenDiameters->{32,16,36,25,32,20,30,30,33,29,25,26,26,25,33,28,21,28}}
Scores:
{3,6,3,6,5,4,4,3,3,5,5,5,3,3,5,5,6,5}
Output: 79
Case#5 (Hacker)
{MaxDistance->320,SliceAngle->30,HoleDistances->{147,497,110,528,409,118,196,154,134,514,374,491,131,138,523,478,481,494},GreenDiameters->{32,16,36,25,32,20,30,30,33,29,25,26,26,25,33,28,21,28}}
Scores:
{6,8,5,8,7,6,6,6,6,8,8,8,6,6,8,8,8,8}
Output: 126
Reglas
- Se puede usar cualquier formato para la entrada. La salida es simplemente el número de trazos simulados, por lo que debe ser un número entero.
- Este es el código de golf, por lo que gana la respuesta más corta en bytes. Se aplican lagunas estándar.
MaxDistance
del hoyo?GreenDiameter/2
, en cuyo caso sí, ya que el puntaje está limitado a 8 y siempre hay 2 putts.Respuestas:
JavaScript (ES7),
128126 bytesPruébalo en línea!
Explicación
Debido a que solo importa la distancia desde la pelota hasta el hoyo y no las coordenadas de la pelota, podemos escribir un algoritmo que calcule qué tan cerca llega la pelota al hoyo con cada disparo, y luego ejecutarlo repetidamente hasta que la pelota llegue al green. ¿Pero cómo hacemos esto?
Reutilizando el útil diagrama de OP que explica el movimiento de la pelota, con modificaciones de MS Paint:
Tenemos acceso a estos números:
Y el objetivo es encontrar x , la distancia de la pelota al hoyo después de que se realiza el disparo.
Primero notamos que a y b son simplemente l cos θ y l sin θ , respectivamente. Podemos ver que mediante el teorema de Pitágoras, x puede representarse como sqrt (b 2 + (da) 2 ) . Expandiendo esto, obtenemos
Y así, la nueva distancia de la bola al hoyo será sqrt (l 2 + d 2 - 2dl cos θ) . Luego contamos las iteraciones que se necesitan para obtener esta distancia dentro del radio del green, sumar 2 y limitar a 8 para obtener el puntaje final para ese hoyo.
(Gracias a @ LegionMammal978 por señalar que todos los cálculos que hice son un resultado directo de la ley de cosenos ...)
Curiosamente, cuando la pelota está más cerca del hoyo que su tiro máximo, l = dy podemos simplificar la fórmula un poco más:
Para encontrar el número de iteraciones restantes, podríamos simplemente encontrar d / r (donde r = el radio del verde) y dividirlo por sqrt (2 - 2cos (θ)) , luego tomar el techo del resultado y sumar 2 Desafortunadamente, esto no parece ser tan corto como solo encontrar el menor d y la longitud máxima del disparo.
fuente
.0174533
da un error de solo 2.38e-7 en el coseno de 45 grados, por lo que podría ser lo suficientemente insignificante como para funcionar. En realidad, ahora que lo miro,71/4068
(=355/113 / 180
) es aún mejor, dando un error de solo 4.135e-10 ...Perl 5 ,
144138 + 12 (-MMath::Trig
) = 150 bytesafeitó algunos bytes usando la simplificación de la fórmula de @ETHproductions
Pruébalo en línea!
Cambió un poco el formato de entrada:
fuente
Julia 0.6 , 106 bytes
Pruébalo en línea!
Basado en la respuesta de ETHproductions .
Explicación
s(m,d,g,v=2)=...
Defina la funcións
que calcula la puntuación de un hoyo de forma recursiva.sum(s.([m],D,G))
Solicites
cada hoyo y sume el resultado..
es una aplicación de función por elementos con expansión singleton. P.ej:min.([1],[2,3]) = [min(1,2), min(1,3)]
fuente