Mã Golf mô phỏng Golf


13

Đưa ra một danh sách các sân lỗ, kích thước màu xanh lá cây, góc cắt và khoảng cách tối đa, tính điểm golf .

Giả định

  • Trái đất phẳng
  • Tất cả các màu xanh lá cây là hình tròn
  • Góc cắt sẽ nằm trong khoảng từ -45 đến 45 độ và sẽ được tính theo độ
  • Tất cả các khoảng cách trong cùng một số liệu (thước hoặc mét, không quan trọng)
  • Không có giới hạn, vật cản hoặc dogless
  • Điểm tối đa trên bất kỳ lỗ nào là 8
  • Tất cả các bức ảnh di chuyển ít hơn khoảng cách tối đa hoặc khoảng cách đến lỗ, theo hướng được xác định bởi góc tới lỗ cộng với góc cắt.
  • Khoảng cách được đo bằng khoảng cách đường thẳng hoặc khoảng cách Euclide giữa điểm bắt đầu và điểm kết thúc.
  • Khoảng cách tối đa và góc cắt là như nhau cho tất cả các ảnh trên tất cả các lỗ
  • Các golfer luôn luôn đặt hai gậy một lần vào màu xanh lá cây (hoặc chính xác là trên cạnh của màu xanh lá cây).

Thí dụ

Hãy xem xét hacker từ trường hợp thử nghiệm số 5 dưới đây để tìm lỗ số 2. Tin tặc có thể đánh bóng 320 yard, nhưng luôn cắt 30 độ. Nếu chúng ta giả sử mà không mất tính tổng quát rằng hộp tee ở {0,0} và màu xanh lá cây ở {497,0}, thì anh ta sẽ bắn trúng các điểm sau, đến màu xanh lá cây với phát bắn thứ 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}}

Tại thời điểm này, điểm của anh ta sẽ là 9 do hai yêu cầu, vì vậy điểm cuối cùng của anh ta được giới hạn ở mức 8, theo các giả định.

Về mặt đồ họa, nó sẽ trông như thế này: nhập mô tả hình ảnh ở đây

Các trường hợp thử nghiệm

Tất cả các trường hợp kiểm tra có các khóa học 18 lỗ tiêu chuẩn

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

Quy tắc

  • Bất kỳ định dạng có thể được sử dụng cho đầu vào. Đầu ra chỉ đơn giản là số lượng các nét được mô phỏng, do đó nên là một số nguyên.
  • Đây là vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng. Tiêu chuẩn áp dụng.

5
Tại sao "Trái đất phẳng" theo các giả định?
Jo King

Chúng ta có thể cho rằng sẽ không bao giờ mất quá 6 cú đánh để đưa bóng vào trong MaxDistancelỗ không?
Sản phẩm ETH

1
@JoKing Chủ yếu, để mặt phẳng chứ không phải hình học hình cầu được sử dụng; thứ hai vì không cần phải giả gà hình cầu :)
Kelly Lowder

@ETHproductions, bạn cũng có thể nhưng điều đó không cần thiết. Tôi nghĩ có lẽ bạn có nghĩa là GreenDiameter/2, trong trường hợp có, vì điểm số được giới hạn ở mức 8 và luôn có 2 điểm.
Kelly Lowder

Đừng lo lắng, tôi đã đặt câu hỏi cho ý nghĩa của nó như thế nào ;-) Kỹ thuật của tôi dựa trên điều này dường như không ở đâu gần như câu trả lời hiện tại của tôi, vì vậy, đừng
bận

Câu trả lời:


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

Hãy thử trực tuyến!

Giải trình

Bởi vì chỉ khoảng cách từ quả bóng đến lỗ mới quan trọng chứ không phải tọa độ của quả bóng, chúng ta có thể viết một thuật toán tính toán mức độ bóng đến gần lỗ với mỗi cú đánh, sau đó chạy liên tục cho đến khi bóng chạm tới green. Nhưng làm thế nào để chúng tôi làm điều này?

Sử dụng lại sơ đồ hữu ích của OP giải thích chuyển động bóng, với sửa đổi MS Paint:

khoa học về golf

Chúng tôi có quyền truy cập vào những con số này:

  • d , khoảng cách hiện tại từ bóng đến lỗ;
  • θ , góc lát; và
  • l , chiều dài của cú đánh (tối thiểu là d và chiều dài bắn tối đa).

Và mục tiêu là tìm x , khoảng cách từ bóng đến lỗ sau khi thực hiện cú sút.

Đầu tiên chúng ta lưu ý rằng ab chỉ đơn giản là l cosl sin , tương ứng. Chúng ta có thể thấy rằng theo định lý Pythagore, x có thể được biểu diễn dưới dạng sqrt (b 2 + (da) 2 ) . Mở rộng ra, chúng tôi nhận được

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

Và do đó, khoảng cách mới từ bóng đến lỗ sẽ là sqrt (l 2 + d 2 - 2dl cos θ) . Sau đó, chúng tôi đếm số lần lặp để có khoảng cách này trong bán kính của màu xanh lá cây, thêm 2 và giới hạn ở mức 8 để có được điểm số cuối cùng cho lỗ đó.

(Cảm ơn @ LegionMammal978 vì đã chỉ ra rằng tất cả các tính toán tôi đã thực hiện là kết quả trực tiếp của luật vũ trụ ...)


Thật thú vị, khi quả bóng ở gần lỗ hơn cú đánh tối đa của nó, l = d và chúng ta có thể đơn giản hóa công thức hơn một chút:

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

Để tìm # số lần lặp còn lại, sau đó chúng ta có thể chỉ cần tìm d / r (trong đó r = bán kính của màu xanh lá cây) và chia số đó cho sqrt (2 - 2cos (θ)) , sau đó lấy trần của kết quả và thêm 2 Thật không may, điều này dường như không ngắn bằng việc chỉ tìm thấy nhỏ hơn của d và chiều dài bắn tối đa.


Điều này có vẻ khá vững chắc. Bạn có thể vui lòng gửi một liên kết TIO khi bạn có cơ hội?
Kelly Lowder

1
@KellyLowder Chắc chắn rồi, xong rồi.
Sản phẩm ETH

2
Liệu phương trình cuối cùng của bạn có phải là hệ quả trực tiếp của định luật vũ trụ không?
LegionMammal978

@ LegionMammal978 Tôi đoán nó sẽ ... Xin lỗi, lượng giác của tôi hơi rỉ sét: P
Sản phẩm ETH

1
@ kamoroso94 Đó có thể là một ý tưởng tốt. Việc sử dụng .0174533cho sai số chỉ 2,38e-7 trên cosin 45 độ, do đó nó có thể không đáng kể để hoạt động. Thực tế bây giờ khi tôi nhìn vào nó, 71/4068(= 355/113 / 180) thậm chí còn tốt hơn, đưa ra lỗi chỉ là 4.135e-10 ...
Sản phẩm ETH

3

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

đã xóa một vài byte bằng cách đơn giản hóa công thức của @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}

Hãy thử trực tuyến!

Thay đổi định dạng đầu vào một chút:

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

Hãy thử trực tuyến!

Dựa trên câu trả lời của ETHproductions .

Giải trình

  • s(m,d,g,v=2)=...Xác định hàm stính điểm cho một lỗ theo cách đệ quy.
  • sum(s.([m],D,G))Áp dụng scho mỗi lỗ và tổng hợp kết quả. .là ứng dụng chức năng phần tử khôn ngoan với mở rộng singleton. Ví dụ: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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.