Golf Kode Simulasi Golf

13

Diberi daftar hole yardage, ukuran hijau, sudut irisan dan jarak maksimal, hitung skor golf .

Asumsi

  • Bumi itu datar
  • Semua sayuran berbentuk lingkaran
  • Sudut irisan akan berada di antara -45 dan 45 derajat dan akan diberikan dalam derajat
  • Semua jarak dalam metrik yang sama (yard atau meter, tidak masalah)
  • Tidak ada batasan, penghalang atau dogleg
  • Skor maksimum pada setiap hole adalah 8
  • Semua bidikan bergerak lebih rendah dari jarak maks atau jarak ke lubang, dalam arah yang ditentukan oleh sudut ke lubang ditambah sudut irisan.
  • Jarak diukur sebagai garis lurus atau jarak Euclidean antara titik awal dan titik akhir.
  • Jarak maksimum dan sudut irisan sama untuk semua bidikan di semua lubang
  • Pegolf selalu dua-putt sekali di atas hijau (atau tepat di tepi hijau).

Contoh

Mari kita lihat peretas dari test case # 5 di bawah ini untuk hole # 2. Peretas bisa memukul bola 320 yard, tetapi selalu memotong 30 derajat. Jika kita mengasumsikan tanpa kehilangan keumuman bahwa kotak tee berada di {0,0} dan hijau di {497,0}, maka dia akan memukul tembakan ke titik-titik berikut, tiba di hijau dengan tembakan ke-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}}

Pada titik ini, skornya akan menjadi 9 karena dua putt diperlukan, sehingga skor akhir untuknya akan dibatasi pada 8, sesuai asumsi.

Secara grafis, akan terlihat seperti ini: masukkan deskripsi gambar di sini

Uji Kasus

Semua kasus uji memiliki kursus 18-lubang standar

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

Aturan

  • Format apa pun dapat digunakan untuk input. Output hanyalah jumlah stroke yang disimulasikan, jadi harus berupa bilangan bulat.
  • Ini adalah sehingga jawaban tersingkat dalam byte menang. Celah standar berlaku.
Kelly Lowder
sumber
5
Mengapa "Bumi itu datar" dengan asumsi?
Jo King
Bisakah kita berasumsi bahwa tidak akan membutuhkan lebih dari 6 tembakan untuk membuat bola masuk ke dalam MaxDistancelubang?
ETHproduksi
1
@ JOOKING Terutama, sehingga bidang yang digunakan daripada geometri bola; kedua karena tidak perlu mengasumsikan ayam bulat :)
Kelly Lowder
@ ETHproductions, well Anda bisa tapi itu tidak perlu. Saya pikir mungkin maksud Anda GreenDiameter/2, dalam hal ini ya, karena skor dibatasi pada 8 dan selalu ada 2 putt.
Kelly Lowder
Jangan khawatir, saya menjawab pertanyaan itu bagaimana saya bersungguh-sungguh ;-) Teknik saya yang mengandalkan ini sepertinya tidak sesingkat jawaban saya saat ini, jadi jangan pikirkan saya kira ...
ETHproduksi

Jawaban:

10

JavaScript (ES7), 128 126 byte

(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

Cobalah online!

Penjelasan

Karena hanya jarak dari bola ke lubang yang penting dan bukan koordinat bola, kita dapat menulis algoritma yang menghitung seberapa dekat bola ke lubang dengan setiap tembakan, lalu jalankan itu berulang kali hingga bola mencapai hijau. Tetapi bagaimana kita melakukan ini?

Menggunakan kembali diagram OP yang membantu menjelaskan pergerakan bola, dengan modifikasi MS Paint:

ilmu golf

Kami memiliki akses ke nomor-nomor ini:

  • d , jarak saat ini dari bola ke lubang;
  • θ , sudut irisan; dan
  • l , panjang tembakan (minimal d dan panjang tembakan maks).

Dan tujuannya adalah untuk menemukan x , jarak dari bola ke lubang setelah tembakan diambil.

Pertama-tama kita perhatikan bahwa a dan b sederhana l cos θ dan l sin θ . Kita dapat melihat bahwa dengan teorema Pythagoras, x dapat direpresentasikan sebagai sqrt (b 2 + (da) 2 ) . Memperluas ini, kita dapatkan

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

Jadi, jarak baru dari bola ke lubang adalah sqrt (l 2 + d 2 - 2dl cos θ) . Kemudian kita menghitung iterasi yang diperlukan untuk mendapatkan jarak ini dalam radius hijau, tambahkan 2, dan tutup pada 8 untuk mendapatkan skor akhir untuk lubang itu.

(Terima kasih kepada @ LegionMammal978 karena menunjukkan bahwa semua perhitungan yang saya buat adalah akibat langsung dari hukum cosinus ...)


Cukup menarik, ketika bola lebih dekat ke lubang daripada tembakan maksimalnya, l = d dan kita dapat menyederhanakan rumusnya sedikit lebih jauh:

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

Untuk menemukan # dari iterasi yang tersisa, kita bisa menemukan d / r (di mana r = jari-jari hijau) dan membaginya dengan sqrt (2 - 2cos (θ)) , lalu ambil plafon hasilnya dan tambahkan 2 Sayangnya, ini tampaknya tidak sesingkat hanya dengan menemukan yang lebih kecil dari d dan panjang tembakan maks.

Produksi ETH
sumber
Ini terlihat cukup solid. Bisakah Anda memposting tautan TIO ketika Anda punya kesempatan?
Kelly Lowder
1
@KellyLowder Tentu, sudah selesai.
ETHproduksi
2
Bukankah persamaan terakhir Anda akan menjadi konsekuensi langsung dari hukum cosinus?
LegionMammal978
@ LegionMammal978 Saya kira itu akan ... Maaf, trigonometri saya agak berkarat: P
ETHproduksi
1
@ kamoroso94 Itu mungkin ide yang bagus. Menggunakan .0174533memberikan kesalahan hanya 2,38e-7 pada cosinus 45 derajat, sehingga mungkin cukup diabaikan untuk bekerja. Sebenarnya sekarang saya melihatnya, 71/4068(= 355/113 / 180) bahkan lebih baik, memberikan kesalahan hanya 4.135e-10 ...
ETHproductions
3

Perl 5 , 144 138 + 12 ( -MMath::Trig) = 150 byte

mencukur beberapa byte menggunakan penyederhanaan formula @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}

Cobalah online!

Mengubah format input sedikit:

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

Julia 0,6 , 106 byte

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

Cobalah online!

Berdasarkan jawaban ETHproductions .

Penjelasan

  • s(m,d,g,v=2)=... Tentukan fungsi s yang menghitung skor untuk satu lubang secara rekursif.
  • sum(s.([m],D,G))Terapkan suntuk setiap lubang dan jumlah hasilnya. .adalah aplikasi fungsi elemen-bijaksana dengan ekspansi tunggal. Misalnya: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
LukeS
sumber