Код Гольф імітований гольф


13

Враховуючи список ямкових отворів, зелені розміри, кут зрізу та максимальну відстань, обчисліть бал для гольфу .

Припущення

  • Земля плоска
  • Вся зелень кругла
  • Кут зрізу буде від -45 до 45 градусів і буде заданий у градусах
  • Усі відстані в одній метриці (ярди або метри, неважливо)
  • Ніяких меж, перешкод чи доглг
  • Максимальна оцінка на будь-якому отворі - 8
  • Усі постріли проїжджають менший за максимальну відстань або відстань до отвору в напрямку, визначеному кутом до отвору плюс кутом зрізу.
  • Відстань вимірюється як пряма або евклідова відстань між початковою і кінцевою точкою.
  • Максимальна відстань і кут зрізу однакові для всіх пострілів у всіх отворах
  • Гольфіст завжди два-шпаклівки один раз на зеленому (або точно на краю зеленого).

Приклад

Давайте подивимось на хакера з тестового випадку №5 нижче для отвору №2. Хакер може вдарити по м'ячу в 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}}

У цей момент його рахунок складе 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
Чому за припущеннями "Земля плоска"?
Jo King

Чи можемо ми припустити, що ніколи не знадобиться більше 6 пострілів, щоб добити м'яч всередину MaxDistanceотвору?
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 Paint:

наука про гольф

У нас є доступ до цих номерів:

  • d , поточна відстань від кулі до отвору;
  • θ , кут зрізу; і
  • l , довжина пострілу (мінімум d та максимальна довжина пострілу).

І мета - знайти х , відстань від кулі до лунки після зробленого пострілу.

Спочатку зазначимо, що a і b просто l cos θ і l sin θ відповідно. Видно, що за теоремою Піфагора x можна представити як sqrt (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 / r (де r = радіус зеленого) і розділити це на sqrt (2 - 2cos (θ)) , а потім взяти стелю результату і додати 2 На жаль, це здається не таким коротким, як лише знаходження менших d і максимальної довжини зйомки.


Це виглядає досить солідно. Чи можете ви опублікувати посилання TIO, коли є можливість?
Келлі Лоудер

1
@KellyLowder Звичайно, готово.
ETHproductions

2
Чи не було б ваше остаточне рівняння прямим наслідком закону косинусів?
LegionMammal978

@ LegionMammal978 Я думаю, це буде ... Вибачте, моя тригонометрія трохи іржава: P
ETHproductions

1
@ kamoroso94 Це може бути хорошою ідеєю. Використання .0174533дає похибку всього 2,38е-7 в косинусі 45 градусів, тому це може бути досить мізерно для роботи. Насправді тепер, коли я дивлюся на це, 71/4068(= 355/113 / 180) ще краще, даючи помилку всього в 4,135е-10 ...
ETHproductions

3

Perl 5 , 144 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)=...Визначте функцію, sяка обчислює оцінку за одне отвір рекурсивно.
  • 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.