À partir d'une liste de mètres de trous, de tailles vertes, d'un angle de tranche et d'une distance maximale, calculez un score de golf .
Hypothèses
- La terre est plate
- Tous les verts sont circulaires
- L'angle de coupe sera compris entre -45 et 45 degrés et sera donné en degrés
- Toutes les distances dans la même métrique (yards ou mètres, peu importe)
- Pas de limites, d'obstacles ou de doglegs
- Le score maximum sur n'importe quel trou est de 8
- Tous les tirs parcourent la moindre distance maximale ou distance au trou, dans une direction définie par l'angle du trou plus l'angle de la tranche.
- La distance est mesurée comme la ligne droite ou la distance euclidienne entre le point de départ et le point d'arrivée.
- La distance maximale et l'angle de coupe sont les mêmes pour toutes les prises de vue sur tous les trous
- Le golfeur fait toujours deux coups roulés une fois sur le green (ou exactement au bord du green).
Exemple
Regardons le pirate du cas de test n ° 5 ci-dessous pour le trou n ° 2. Le pirate peut frapper la balle à 320 mètres, mais tranche toujours à 30 degrés. Si nous supposons sans perte de généralité que la zone de départ est à {0,0} et que le vert est à {497,0}, alors il frappera les tirs aux points suivants, arrivant sur le vert avec le 7ème coup:
{{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}}
À ce stade, son score serait de 9 en raison des deux putts requis, donc le score final pour lui est plafonné à 8, selon les hypothèses.
Graphiquement, cela ressemblera à ceci:
Cas de test
Tous les cas de test ont des parcours standard de 18 trous
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
Règles
- N'importe quel format peut être utilisé pour l'entrée. La sortie est simplement le nombre de traits simulés, donc devrait être un entier.
- Il s'agit de code-golf, donc la réponse la plus courte en octets l'emporte. Des échappatoires standard s'appliquent.
MaxDistance
du trou?GreenDiameter/2
, dans ce cas, oui, car le score est plafonné à 8 et il y a toujours 2 putts.Réponses:
JavaScript (ES7),
128126 octetsEssayez-le en ligne!
Explication
Parce que seule la distance entre la balle et le trou est importante et non les coordonnées de la balle, nous pouvons écrire un algorithme qui calcule la distance entre la balle et le trou à chaque tir, puis la répéter jusqu'à ce que la balle atteigne le vert. Mais comment fait-on cela?
Réutilisation du diagramme utile d'OP expliquant le mouvement de la balle, avec des modifications de MS Paint:
Nous avons accès à ces numéros:
Et le but est de trouver x , la distance de la balle au trou après la prise de vue.
Notons d'abord que a et b sont simplement l cos θ et l sin θ , respectivement. Nous pouvons voir que par le théorème de Pythagore, x peut être représenté comme sqrt (b 2 + (da) 2 ) . En développant cela, nous obtenons
Et donc, la nouvelle distance de la balle au trou sera sqrt (l 2 + d 2 - 2dl cos θ) . Ensuite, nous comptons les itérations nécessaires pour obtenir cette distance dans le rayon du vert, ajoutons 2 et plafons à 8 pour obtenir le score final pour ce trou.
(Merci à @ LegionMammal978 d'avoir souligné que tous les calculs que j'ai faits sont un résultat direct de la loi des cosinus ...)
Fait intéressant, lorsque la balle est plus proche du trou que son tir maximum, l = d et nous pouvons simplifier la formule un peu plus loin:
Pour trouver le nombre d'itérations restantes, nous pourrions alors simplement trouver d / r (où r = le rayon du vert) et diviser cela par sqrt (2 - 2cos (θ)) , puis prendre le plafond du résultat et ajouter 2 Malheureusement, cela ne semble pas être aussi court que de trouver le plus petit de d et la longueur de prise de vue maximale.
la source
.0174533
donne une erreur de seulement 2,38e-7 sur le cosinus de 45 degrés, il peut donc être assez négligeable pour fonctionner. En fait, maintenant que je le regarde,71/4068
(=355/113 / 180
) est encore mieux, donnant une erreur de seulement 4.135e-10 ...Perl 5 ,
144138 + 12 (-MMath::Trig
) = 150 octetsrasé quelques octets en utilisant la simplification de la formule @ETHproductions
Essayez-le en ligne!
Modifié un peu le format d'entrée:
la source
Julia 0.6 , 106 octets
Essayez-le en ligne!
Basé sur la réponse d'ETHproductions .
Explication
s(m,d,g,v=2)=...
Définissez la fonctions
qui calcule le score pour un trou de manière récursive.sum(s.([m],D,G))
Appliquers
pour chaque trou et additionner le résultat..
est une application de fonction élément par élément avec une extension singleton. Par exemple:min.([1],[2,3]) = [min(1,2), min(1,3)]
la source