Kod Golf Simüle Golf


13

Delik yardaları, yeşil boyutlar, dilim açısı ve maksimum mesafe listesi verildiğinde, bir golf skoru hesaplayın .

Varsayımlar

  • Dünya düz
  • Tüm yeşillikler daireseldir
  • Dilim açısı -45 ila 45 derece arasında olacak ve derece olarak verilecektir
  • Aynı metrikteki tüm mesafeler (yarda veya metre, önemli değil)
  • Sınırların, engellerin veya kenarlıkların olmaması
  • Herhangi bir delikteki maksimum puan 8'dir
  • Tüm çekimler, deliğe açı artı dilim açısı ile tanımlanan bir yönde deliğe olan maksimum mesafe veya delikten daha az mesafe kat eder.
  • Mesafe, başlangıç ​​ve bitiş noktası arasındaki düz çizgi veya Öklid mesafesi olarak ölçülür.
  • Maksimum mesafe ve dilim açısı tüm deliklerdeki tüm çekimler için aynıdır
  • Golfçü her zaman bir kez yeşile (veya tam olarak yeşilin kenarına) iki kez koyar.

Misal

Hacker'a, # 2 deliği için aşağıdaki # 5 numaralı test durumundan bakalım. Hacker topa 320 metre vurabilir, ancak her zaman 30 derece dilimlenir. Genelliği kaybetmeden, tee kutusunun {0,0} ve yeşilin {497,0} olduğunu varsayarsak, 7. atışla yeşile gelen aşağıdaki noktalara vurur:

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

Bu noktada, gereken iki puttan dolayı puanı 9 olur, bu nedenle varsayımlara göre onun için son puan 8'de sınırlanır.

Grafiksel olarak şöyle görünecektir: resim açıklamasını buraya girin

Test Durumları

Tüm test vakalarında standart 18 delikli kurslar vardır

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

kurallar

  • Giriş için herhangi bir format kullanılabilir. Çıktı sadece simüle edilen vuruş sayısıdır, bu nedenle bir tamsayı olmalıdır.
  • Bu yani bayt en kısa cevap kazanır. Standart boşluklar geçerlidir.

5
Neden "Dünya düz" varsayımlar altında?
Jo King

Topu MaxDistancedeliğin içine sokmanın asla 6 vuruştan fazla sürmeyeceğini varsayabilir miyiz ?
ETHproductions

1
@JoKing Temel olarak, küresel geometri yerine düzlem kullanılır; İkincisi, küresel tavukları varsaymaya gerek olmadığı için :)
Kelly Lowder

@ETHproductions, yapabilirsin ama bu gereksiz. Sanırım belki demek istediniz GreenDiameter/2, bu durumda evet, puan 8 ile sınırlıdır ve her zaman 2 macun vardır.
Kelly Lowder

Endişelenme, bu soruyu nasıl demek istediğimi ifade ettim ;-) Buna dayanan tekniğim şu anki cevabım kadar kısa bir yerde görünmüyor, bu yüzden sanırım boşver ...
ETHproductions

Yanıtlar:


10

JavaScript (ES7), 128 126 bayt

(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

Çevrimiçi deneyin!

açıklama

Topun koordinatlarına değil, toptan sadece deliğe olan mesafe önemli olduğundan, topun her atışta deliğe ne kadar yaklaştığını hesaplayan bir algoritma yazabiliriz, sonra top yeşile ulaşana kadar tekrar tekrar çalıştırabiliriz. Ama bunu nasıl yapacağız?

OP'nin top hareketini açıklayan MS Paint modifikasyonları ile yardımcı şemasını yeniden kullanma:

golf bilimi

Bu sayılara erişimimiz var:

  • d , toptan deliğe mevcut mesafe;
  • θ , dilim açısı; ve
  • l , atış uzunluğu (minimum d ve maksimum atış uzunluğu).

Ve amaç x'i bulmaktır , şut çekildikten sonra topla delik arasındaki mesafe.

İlk önce a ve b'nin sırasıyla l cos θ ve l sin θ olduğunu not ediyoruz . Pisagor teoremi ile x'in sqrt (b 2 + (da) 2 ) olarak temsil edilebildiğini görebiliriz . Bunu genişleterek,

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(θ))

Ve böylece, toptan deliğe olan yeni mesafe sqrt olacaktır (l 2 + d 2 - 2dl cos θ) . Daha sonra, bu mesafeyi yeşil yarıçapı içinde almak için gereken iterasyonları sayıyoruz, 2 ekliyoruz ve o delik için son puanı almak için 8'de başlıyoruz.

(Yaptığım tüm hesaplamaların kosinüs yasasının doğrudan bir sonucu olduğunu belirten @ LegionMammal978'e teşekkürler ...)


İlginç bir şekilde, top deliğe maksimum atışından daha yakın olduğunda, l = d ve formülü biraz daha basitleştirebiliriz:

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(θ))

Kalan yineleme sayısını bulmak için, d / r (burada r = yeşil yarıçapı) bulabilir ve bunu sqrt (2 - 2cos (θ)) ile bölebiliriz , ardından sonucun tavanını alabilir ve 2 ekleyebiliriz. Ne yazık ki, bu sadece d ve maksimum atış uzunluğunu bulmak kadar kısa görünmüyor .


Bu oldukça sağlam görünüyor. Şansınız olduğunda lütfen bir TIO bağlantısı gönderebilir misiniz?
Kelly Lowder

1
@KellyLowder Elbette, bitti.
ETHproductions

2
Son denkleminiz, kosinüs yasasının doğrudan bir sonucu olmaz mı?
LegionMammal978

@ LegionMammal978 Sanırım ... Üzgünüm, trigonometri biraz paslı: P
ETHproductions

1
@ kamoroso94 Bu iyi bir fikir olabilir. Kullanımı .017453345 derecenin kosinüsünde sadece 2.38e-7 hatası verir, bu nedenle çalışmak yeterince ihmal edilebilir. Aslında şimdi baktığımda, 71/4068(= 355/113 / 180) daha iyi, sadece 4.135e-10 hatası veriyor ...
ETHproductions 23:18

3

Perl 5 , 144138 + 12 ( -MMath::Trig) = 150 bayt

@ETHproductions 'formülünü basitleştirerek birkaç bayt tıraş etti

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}

Çevrimiçi deneyin!

Giriş biçimini biraz değiştirdik:

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

2

Julia 0.6 , 106 bayt

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)))

Çevrimiçi deneyin!

ETHproductions'ın cevabına dayanarak .

açıklama

  • s(m,d,g,v=2)=...sBir deliğin puanını yinelemeli olarak hesaplayan işlevi tanımlayın .
  • sum(s.([m],D,G))sHer delik için uygulayın ve sonucu toplayın. .singleton genişleme ile element-wise fonksiyon uygulamasıdır. Örneğin: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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.