Bắt đầu so le


13

Trong các cuộc đua trong đó các tay đua đi vòng quanh ít nhất một khúc cua, các vị trí xuất phát của mỗi tay đua được đặt so le, để mỗi tay đua di chuyển cùng một khoảng cách quanh đường đua (nếu không, tay đua trong làn đường trong cùng sẽ có lợi thế rất lớn ).

Với độ dài của trục chính và trục phụ (hoặc bán chính và bán phụ, nếu bạn thích) của đường elip và số làn đường trong đường đua, hãy tạo ra khoảng cách từ điểm bắt đầu của làn trong cùng mà mỗi làn nên loạng choạng.

Thông số kỹ thuật

  • Mỗi làn là một hình elip với các trục bán chính dài hơn 5 đơn vị so với làn ngắn nhất tiếp theo. Để đơn giản, giả sử rằng các làn đường có 0 chiều rộng.
  • Làn đường trong cùng luôn bắt đầu từ 0 và mọi điểm bắt đầu khác là một số nguyên dương lớn hơn hoặc bằng điểm bắt đầu trước đó.
  • Đầu vào và đầu ra có thể ở bất kỳ định dạng thuận tiện và hợp lý.
  • Các đầu vào sẽ luôn luôn là số nguyên.
  • Bạn phải tính chu vi của bản nhạc trong vòng 0,01 đơn vị giá trị thực.
  • Các đầu ra phải được làm tròn xuống số nguyên gần nhất (thả nổi).
  • Dòng kết thúc là điểm khởi đầu cho tay đua trong cùng. Chỉ có một vòng đua trong cuộc đua.
  • Độ dài của các trục được đo bằng cách sử dụng làn trong cùng của đường đua.
  • Xuất ra 0 cho phần bù của làn trong cùng là tùy chọn.

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

Định dạng: a, b, n -> <list of offsets, excluding innermost lane>

20, 10, 5 -> 30, 61, 92, 124
5, 5, 2 -> 31
15, 40, 7 -> 29, 60, 91, 121, 152, 183
35, 40, 4 -> 31, 62, 94

Các trường hợp thử nghiệm này được tạo bằng tập lệnh Python 3 sau, sử dụng xấp xỉ chu vi của một hình elip do Ramanujan nghĩ ra:

#!/usr/bin/env python3

import math

a = 35 # semi-major axis
b = 40 # semi-minor axis
n = 4  # number of lanes
w = 5  # spacing between lanes (constant)

h = lambda a,b:(a-b)**2/(a+b)**2
lane_lengths = [math.pi*(a+b+w*i*2)*(1+3*h(a+w*i,b+w*i)/(10+math.sqrt(4-3*h(a+w*i,b+w*i)))) for i in range(n)]

print("{}, {}, {} -> {}".format(a, b, n, ', '.join([str(int(x-lane_lengths[0])) for x in lane_lengths[1:]])))

Phép tính gần đúng được sử dụng là:

xấp xỉ chu vi hình elip

Cuối cùng, đây là một sơ đồ hữu ích để hiểu các tính toán của phần bù:

theo dõi


Tôi sử dụng xấp xỉ Ramanujan như bạn đã làm. Đó có phải là những gì chúng ta phải làm hay bạn muốn chúng tôi đánh giá sự hội tụ của chuỗi vô tận?
Adám

1
@ Adám Bạn có thể làm bất cứ điều gì cần thiết để có được độ chính xác cần thiết. Xấp xỉ Ramanujan là tốt cho nhiều giá trị vì lỗi của nó là theo thứ tự h**5, điều này phù hợp 0.01với một loạt các giá trị.
Mego

Điều gì tốt là độ chính xác tối thiểu khi không có ràng buộc về kích thước đầu vào?
frageum

Câu trả lời:


2

05AB1E , 43 byte

UVFXY-nXY+WZn/3*©T4®-t+/>Z*žq*5DX+UY+V})¬-ï

Giải trình

UV                                           # X = a, Y = b
  F                                   }      # n times do
   XY-n                                      # (a-b)^2
       XY+W                                  # Z = (a + b)
             /                               # divide (a-b)^2
           Zn                                # by (a+b)^2
              3*                             # multiply by 3
                ©                            # C = 3h
                       /                     # 3h divided by 
                 T                           # 10
                      +                      # +
                  4®-t                       # sqrt(4-3h)
                        >                    # increment
                         Z*žq*               # times (a + b)*pi
                              5DX+UY+V       # increase a and b by 5
                                       )     # wrap in list of circumferences
                                        ¬-   # divide by inner circumference
                                          ï  # floor
                                             # implicitly display

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


2

Haskell, 103 98 byte

c!d|h<-3*d*d/c/c=pi*c*(1+h/(10+sqrt(4-h)))
f a b n|x<-a-b=[floor$(a+b+10*w)!x-(a+b)!x|w<-[1..n-1]]

1

Python 3, 168 164 byte

Cảm ơn @ Adám và @Mego cho -2 byte mỗi

from math import*
h=lambda a,b:3*(a-b)**2/(a+b)**2;C=lambda a,b:pi*(a+b)*(1+h(a,b)/(10+sqrt(4-h(a,b))))
f=lambda a,b,n:[int(C(a+i*5,b+i*5)-C(a,b))for i in range(n)]

Một chức năng f nhận đầu vào thông qua đối số và trả về một danh sách các làn đường, bao gồm cả 0làn đường trong cùng.

Làm thế nào nó hoạt động

Điều này sử dụng xấp xỉ Ramanujan. Chúng tôi chỉ đơn giản là xác định chức năng hC để tính toán tham số và chu vi, sau đó trừ chiều dài của làn trong cùng từ chiều dài của làn và sàn hiện tại, cho tất cả các làn.

Hãy thử nó trên Ideone


sqrt(4-3*h(a,b))là ngắn hơn (4-3*h(a,b))**.5, và floorcó thể được thay thế bởi int. Làm cả hai điều đó có nghĩa là bạn không cần phải nhập math.
Mego

@Mego Cảm ơn. Trừ khi tôi ngu ngốc, không phải hai người đầu tiên có cùng chiều dài sao? Tuy nhiên, nếu câu lệnh nhập bị loại bỏ, thì đó là vấn đề xác định pi.
TheBikingViking 22/8/2016

Bằng cách bao gồm cả 3*trong h, bạn nên lưu hai byte.
Adám

Tôi hoàn toàn nhớ rằng bạn sử dụng piBạn có thể mã hóa nó với độ chính xác đủ. Và vâng, hai cái đầu tiên có cùng độ dài - ý tôi là không cần nhập, tất nhiên! : P
Mego

@ Adám Cảm ơn bạn đã chỉ ra rằng.
TheBikingViking 22/8/2016

1

APL Dyalog , 45 byte

Nhắc cho n , sau đó cho a b . Yêu cầu ⎕IO←0đó là mặc định trên nhiều hệ thống.

1↓(⊢-⊃)(○+×1+h÷10+.5*⍨4-h3×2*⍨-÷+)⌿⎕∘.+5×⍳⎕

⍳⎕nhắc cho n , sau đó đưa ra {0, 1, 2, ..., n 1)

nhân với lăm để có được {0, 5, 10, ..., 5 n -5}

⎕∘.+nhắc cho mộtb , sau đó thực hiện một bảng Ngoài ra:
  một , một 5, một 10, ... một 5 n -5
  b , b 5, b 10, ... b 5 n −5

(... )⌿áp dụng hàm ngoặc đơn cho từng cặp dọc, tức là
  f ( a , b ), f ( a +5, b +5), f ( a +10, b +10), ..., f ( a + 5 n -5, b 5 n -5)
  nơi f ( x , y ) là *

lần pi

( x + y ) lần

1+ một cộng

h ( x , y ) [hàm h sẽ được xác định sau] chia cho

10+ mười cộng

.5*⍨ căn bậc hai của

4- bốn điểm trừ

h← h ( x , y ), nghĩa là

ba lần

2*⍨ hình vuông của

( x - y ) chia cho

+ x + y

(⊢-⊃) vào kết quả của hàm được áp dụng cho mỗi cặp, trừ đi giá trị của kết quả đầu tiên

1↓ xóa cái đầu tiên (không)

làm tròn xuống

Dùng thử trực tuyến!


* Trong ngôn ngữ thủ tục:

-÷+tìm phần của sự khác biệt giữa và tổng của xy

2*⍨ bình phương phân số đó

nhân số vuông đó với ba

h←gán sản phẩm đó cho h

4- trừ đi sản phẩm đó từ bốn

.5*⍨ lấy căn bậc hai của sự khác biệt đó

10+ thêm mười vào căn bậc hai

chia h cho tổng đó

1+ thêm một vào phần đó

nhân tổng đó với tổng của x y

nhân sản phẩm đó với số pi

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.