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:
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 kode-golf sehingga jawaban tersingkat dalam byte menang. Celah standar berlaku.
MaxDistance
lubang?GreenDiameter/2
, dalam hal ini ya, karena skor dibatasi pada 8 dan selalu ada 2 putt.Jawaban:
JavaScript (ES7),
128126 byteCobalah 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:
Kami memiliki akses ke nomor-nomor ini:
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
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:
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.
sumber
.0174533
memberikan 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 ...Perl 5 ,
144138 + 12 (-MMath::Trig
) = 150 bytemencukur beberapa byte menggunakan penyederhanaan formula @ETHproductions
Cobalah online!
Mengubah format input sedikit:
sumber
Julia 0,6 , 106 byte
Cobalah online!
Berdasarkan jawaban ETHproductions .
Penjelasan
s(m,d,g,v=2)=...
Tentukan fungsis
yang menghitung skor untuk satu lubang secara rekursif.sum(s.([m],D,G))
Terapkans
untuk setiap lubang dan jumlah hasilnya..
adalah aplikasi fungsi elemen-bijaksana dengan ekspansi tunggal. Misalnya:min.([1],[2,3]) = [min(1,2), min(1,3)]
sumber