コードゴルフ模擬ゴルフ


13

穴のヤード、グリーンサイズ、スライス角度、最大距離のリストが与えられたら、ゴルフスコアを計算します。

仮定

  • 地球は平らです
  • すべてのグリーンは円形です
  • スライス角度は-45〜45度で、度単位で指定されます
  • 同じメトリック内のすべての距離(ヤードまたはメートル、重要ではありません)
  • アウトオブバウンズ、障害物、ドッグレッグはありません
  • 穴の最大スコアは8
  • すべてのショットは、最大距離またはホールまでの距離のうち、ホールへの角度とスライス角度で定義される方向の小さい方を移動します。
  • 距離は、始点と終点の間の直線またはユークリッド距離として測定されます。
  • 最大距離とスライス角度は、すべての穴のすべてのショットで同じです
  • ゴルファーは常にグリーンで2パット(またはグリーンの端)を常に1回パットします。

ホール2については、以下のテストケース5のハッカーを見てみましょう。ハッカーはボールを320ヤード打撃できますが、常に30度スライスします。一般性を失うことなく、ティーボックスが{0,0}にあり、グリーンが{497,0}にあると仮定すると、彼は次のポイントまでショットをヒットし、7番目のショットでグリーンに到達します。

{{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}}

この時点で、2つのパットが必要なため、彼のスコアは9になります。したがって、彼の最終スコアは、仮定により8に制限されます。

グラフィカルには、次のようになります。 ここに画像の説明を入力してください

テストケース

すべてのテストケースには、標準の18ホールコースがあります

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

ルール

  • 入力には任意の形式を使用できます。出力は、シミュレートされたストロークの数であるため、整数である必要があります。
  • これはので、バイト単位の最短回答が勝ちです。標準の抜け穴が適用されます。

5
なぜ仮定の下で「地球は平ら」なのですか?
ジョーキング

ボールをMaxDistanceホール内に入れるのに6ショット以上かかることはないと想定できますか?
ETHproductions

1
@JoKing主に、球面ジオメトリではなく平面が使用されます。第二に、球形の鶏を想定する必要がなかったためです:)
ケリーロウダー

@ETHproductions、それは可能ですが、それは不要です。多分あなたはGreenDiameter/2、その場合はそうだと思います。スコアは8に制限されており、常に2つのパットがあります。
ケリーロウダー

ない心配を行い、私は;-)これに依存している私の技術はそう...私は推測する気にしない、しかし私の現在の答えとして短いとどこか近くではないようです意味どのようにその質問を言葉で表現
ETHproductions

回答:


10

JavaScript(ES7)、128 126バイト

(m,a,D,S,t=0)=>S.map((s,i)=>t+=(r=(f=d=>d>s/2?1+f((l=d<m?d:m,l*l+d*d-2*d*l*Math.cos(a*Math.PI/180))**.5,s):2)(D[i]))<8?r:8)&&t

オンラインでお試しください!

説明

ボールからホールまでの距離だけが問題であり、ボールの座標は重要ではないため、各ショットでボールがホールにどれだけ近づくかを計算するアルゴリズムを記述し、ボールがグリーンに到達するまで繰り返し実行します。しかし、これをどのように行うのでしょうか?

ボールの動きを説明するOPの役立つ図を、MSペイントを修正して再利用します。

ゴルフの科学

これらの番号にアクセスできます。

  • d、ボールからホールまでの現在の距離。
  • θ、スライス角度。そして
  • l、ショットの長さ(最小dおよび最大ショット長)。

そして、目標は、ショットが取られた後のボールからホールまでの距離xを見つけることです。

まず、ご注意とbが単純ですリットルのcosθL罪θそれぞれ。ピタゴラスの定理により、xsqrt(b 2 +(da)2として表現できることがわかります。これを展開すると、

x = sqrt(b^2 + (d - a)^2)
  = sqrt((l*sin(θ))^2 + (d - l*cos(θ))^2)
  = sqrt((l^2 * sin^2(θ)) + (d^2 - 2*d*l*cos(θ) + l^2 * cos^2(θ))
  = sqrt(l^2 * sin^2(θ) + l^2 * cos^2(θ) + d^2 - 2dl*cos(θ))
  = sqrt(l^2 * (sin^2(θ) + cos^2(θ)) + d^2 - 2dl*cos(θ))
  = sqrt(l^2 * 1 + d^2 - 2dl*cos(θ))
  = sqrt(l^2 + d^2 - 2dl*cos(θ))

だから、穴にボールから新しい距離はなりSQRT(L 2 + D 2 - 2DL COSθ) 。次に、緑の半径内でこの距離を取得するために必要な反復をカウントし、2を追加して8でキャップして、そのホールの最終スコアを取得します。

(私が行った計算のすべてが余弦法則の直接の結果であることを指摘してくれた@ LegionMammal978に感謝します...)


おもしろいことに、ボールが最大ショットよりもホールに近い場合、l = dであり、式をかなり単純化できます。

x = sqrt(l^2 + d^2 - 2dl*cos(θ))
  = sqrt(d^2 + d^2 - 2d^2*cos(θ))
  = sqrt(2d^2 - 2d^2*cos(θ))
  = sqrt(d^2(2 - 2cos(θ)))
  = d * sqrt(2 - 2cos(θ))

残りの反復の数を見つけるには、d / rr =緑の半径)を見つけ、それをsqrt(2-2cos(θ))で除算し、結果の天井を取り、2を加算します。 。残念ながら、これはdと最大ショット長の小さい方を見つけるほど短くはないようです。


これはかなりしっかりしています。機会があればTIOリンクを投稿してください。
ケリーロウダー

1
@KellyLowderはい、できました。
ETHproductions

2
最終的な方程式は、余弦の法則の直接的な結果ではありませんか?
LegionMammal978

@ LegionMammal978それは...申し訳ありませんが、私の三角法は少しさびています:P
ETHproductions

1
@ kamoroso94それは良いアイデアかもしれません。を使用.0174533すると、45度のコサインに対してわずか2.38e-7のエラーが発生するため、動作するのに十分なほど無視できる場合があります。実際に私がそれを見ると、71/4068(= 355/113 / 180)はさらに良くなり、わずか4.135e-10のエラーが出ています...
ETHproductions

3

パール5144 138 + 12(-MMath::Trig)= 150バイト

式の@ETHproductionsの簡略化を使用して、数バイトを削りました

sub p{$_=pi/180*pop;$m=pop;for$b(@_[0..17]){$s=!++$c;1while++$s<6&&$_[17+$c]/2<($b=sqrt$b*$b+($h=$m<$b?$m:$b)**2-2*$h*$b*cos);$t+=$s+2}$t}

オンラインでお試しください!

入力フォーマットを少し変更しました:

Hole 1 distance
Hole 2 distance
...
Hole 18 distance
Hole 1 green diameter
...
Hole 18 green diameter
Maximum distance
Slice angle

2

ジュリア0.6、106バイト

S(m,t,D,G)=(s(m,d,g,v=2)=d<=g/2?v<8?v:8:(l=d<m?d:m;s(l,(d^2+l^2-2d*l*cosd(t))^.5,g,v+1));sum(s.([m],D,G)))

オンラインでお試しください!

ETHproductionsの回答に基づく

説明

  • s(m,d,g,v=2)=... 関数を定義する s1つの穴のスコアを再帰的に計算を。
  • sum(s.([m],D,G))s各穴に適用し、結果を合計します。.シングルトン展開による要素ごとの関数アプリケーションです。例えば:min.([1],[2,3]) = [min(1,2), min(1,3)]
d<=g/2?v<8?v:8:(l=d<m?d:m;s(...)) #
d<=g/2?       :                   # is the ball on the green?
       v<8?v:8                    # yes -> return min(v,8)
               (l=d<m?d:m;s(...)) # no  ->
                                  # calculate new distance using ETHproductions' formula
                                  # increment current score
                                  # call s recursively
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.