Khoảng cách giữa hai điểm di chuyển trên biểu đồ đồ thị cực


23

Giải thích vấn đề ngắn gọn

Viết chương trình tìm khoảng cách tối thiểu giữa hai điểm chỉ di chuyển trên các tia phát ra từ điểm gốc và các vòng tròn tập trung vào điểm gốc.

Giải thích về tiền đề

Bây giờ hãy tưởng tượng chúng ta đang ở trên một chiếc máy bay, và trên chiếc máy bay này, chúng ta chỉ được phép đi du lịch theo những cách đặc biệt. Chúng tôi được phép đi trên bất kỳ tia phát ra từ nguồn gốc.

Tia chúng ta có thể đi du lịch

Chúng ta cũng có thể đi trên bất kỳ vòng tròn nào tập trung tại một vòng tròn

Vòng tròn chúng ta có thể đi du lịch

Bây giờ mục tiêu của chúng tôi là đi từ điểm này đến máy bay khác. Tuy nhiên, chúng ta không thể chỉ đi trên một con đường Euclidian đơn giản, chúng ta chỉ có thể làm điều này nếu các điểm rơi vào một tia phát ra từ trung tâm.

nhập mô tả hình ảnh ở đây

Chúng ta có thể đi du lịch trên cái này vì nó rơi vào một trong những tia sáng của chúng ta.

nhập mô tả hình ảnh ở đây

Chúng tôi cũng có thể đi du lịch trên các vòng tròn tập trung tại điểm gốc.

nhập mô tả hình ảnh ở đây

Ví dụ

Bây giờ đây là thách thức:

Chúng ta phải đi từ điểm này đến điểm khác trong con đường ngắn nhất; thường thì đây là sự kết hợp của việc đi lại trên các vòng tròn và tia.

nhập mô tả hình ảnh ở đây

Điều này, tuy nhiên, nó cũng có thể đi trên hai tia.

nhập mô tả hình ảnh ở đây

Đôi khi tồn tại hai con đường di chuyển khoảng cách tối thiểu.

nhập mô tả hình ảnh ở đây

Vấn đề

Thử thách của bạn là viết một chương trình mà khi được cho hai điểm sẽ cho chúng ta khoảng cách tối thiểu giữa chúng nếu chúng ta tuân theo các quy tắc này. Các đầu vào có thể được đưa ra ở dạng hình chữ nhật hoặc cực và đầu ra phải là một số, khoảng cách giữa.

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

(với đầu vào hình chữ nhật)

(1,1) (1,-1) -> ~ 2.22144
(0,0) (1, 1) -> ~ 1.41421
(1,0) (-0.4161 , 0.90929) -> ~ 2
(1,1) (1, 0) -> ~ 1.19961
(1,2) (3, 4) -> ~ 3.16609

Là các trường hợp thử nghiệm ví dụ ở dạng hình chữ nhật hoặc cực? Ngoài ra: bewteen
Angs

Chúng ở dạng hình chữ nhật, tôi phải làm rõ điều đó
Ando Bando

Là ví dụ cuối cùng đúng? Tôi nhận được ~ 3.166
Angs

6
@Peter Taylor Bởi vì họ không thực sự giống nhau. Theo cách tương tự, một đường dẫn từ 0,0 đến 1,1 trên mặt phẳng xy qua các bước nhỏ xen kẽ theo hướng x và y xuất hiện giống hệt với đường chéo trực tiếp khi chiều dài bước có xu hướng bằng không. Nhưng đường dẫn chéo có độ dài sqrt (2) trong khi đường dẫn bước sẽ luôn có chiều dài 2.
Penguino

1
Tôi nghĩ rằng thách thức sẽ tốt hơn nếu hình ảnh không quá lớn. Hiện tại họ làm cho việc theo dõi văn bản trở nên khó khăn
Luis Mendo

Câu trả lời:


5

Haskell, 49 48 byte

(a!q)c r=min(q+r)$abs(q-r)+acos(cos$a-c)*min q r

Sử dụng:

> let rect2polar (x,y)=(atan2 y x, sqrt(x^2+y^2))
> let test c1 c2=let [(a1,r1),(a2,r2)]=rect2polar<$>[c1,c2] in (a1!r1)a2 r2
> test (1,0) (-0.4161, 0.90929)
1.9999342590038496

Cảm ơn @Zgarb vì đã lưu một byte


Bạn có thể lưu một byte bằng cách định nghĩa (a!q)c rthay vì d a q c r.
Zgarb

4

JavaScript (ES6), 65 byte

with(Math)(r,t,s,u,v=acos(cos(t-u)))=>v<2?abs(r-s)+v*min(r,s):r+s

Có tọa độ cực. Sử dụng mẹo của @Angs để giảm góc xuống từ 0 đến π. Đối với tọa độ hình chữ nhật, một cái gì đó như thế này hoạt động:

with(Math)g=(r,t,s,u,v=acos(cos(t-u)))=>v<2?abs(r-s)+v*min(r,s):r+s
with(Math)f=(x,y,v,w)=>g(hypot(y,x),atan2(y,x),hypot(w,v),atan2(y,v))

3

MATL , 22 byte

|ttsGZ}/X/bX<*|bd|+hX<

Đầu vào là một mảng gồm hai số phức.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

|       % Implicitly input array and take absolute value of its entries
tt      % Duplicate twice
s       % Sum. This is the length of the path that follows the two radii
GZ}     % Push input again and split into the two numbers
/X/     % Divide and compute angle. This gives the difference of the angles
        % of the two points, between -pi and pi
bX<     % Bubble up a copy of the array of radii and compute minimum
*|      % Multiply and take absolute value. This is the arc part of the
        % path that follows one arc and the difference of radii
bd|     % Bubble up a copy of the array of radii and compute absolute
        % difference. This is the other part of the second path
+       % Add. This gives the length of second path
hX<     % Concatenate and take minimum to produce the smallest length.
        % Implicitly display

2

Ruby, 64 byte

Đầu tiên, trình của tôi. Hàm Lambda với các đối số distance 1, angle 1, distance 2, angle2.

->r,a,s,b{([d=(b-a).abs,?i.to_c.arg*4-d,2].min-2)*[r,s].min+s+r}

Bây giờ đây là hai giải pháp khác nhau gồm 66 byte (không bao gồm chuyển nhượng f=), theo sau là lần gửi thực tế của tôi một lần nữa ở mức 64 byte.

Solution 1:Using include Math, 66 bytes excluding f=
include Math;f=->r,a,s,b{[acos(cos(b-a)),2].min*[r,s].min+(s-r).abs}

Solution 2:Using complex number to define PI instead, 66 bytes excluding f=
f=->r,a,s,b{[d=(b-a).abs,?i.to_c.arg*4-d,2].min*[r,s].min+(s-r).abs}

SUBMISSION AGAIN, 64 bytes excluding f=
f=->r,a,s,b{([d=(b-a).abs,?i.to_c.arg*4-d,2].min-2)*[r,s].min+s+r}

Đệ trình dựa trên giải pháp 2, nhưng sử dụng danh tính (s-r).abs= s+r-[s,r].min*2để rút ngắn mã bằng 2 byte, do đó -2bên trong dấu ngoặc.

Tính năng đáng chú ý khác là biểu thức ?i.to_c.arg*4= 2 * PI mà không sử dụng include Math. Nếu độ chính xác thấp hơn được chấp nhận, điều này có thể được thay thế bằng một nghĩa đen.

Giải pháp 2 nhận xét trong chương trình thử nghiệm

f=->r,a,s,b{          #r,s are distances, a,b are angles for points 1 and 2 respectively.                       
    [d=(b-a).abs,       #From nearer point we can take arc of length d radians perhaps crossing zero angle to the ray of the further point
    ?i.to_c.arg*4-d,    #or go the other way round which may be shorter (?i.to_c.arg*4 == 2*PI, subtract d from this.)
    2].min*             #or go through the centre if the angle exceeds 2 radians.
  [r,s].min+          #Multiply the radians by the distance of the nearer point from the origin to get the distance travelled. 
  (s-r).abs           #Now add the distance to move along the ray out to the further point.
}

#test cases per question (given as complex numbers, converted to arrays of [distance,angle]+[distance,angle] (+ concatenates.)
#the "splat" operator * converts the array to 4 separate arguments for the function.
p f[*("1+i".to_c.polar + "1-i".to_c.polar)]
p f[*("0".to_c.polar + "1+i".to_c.polar)]
p f[*("1".to_c.polar + "-0.4161+0.90929i".to_c.polar)]
p f[*("1+i".to_c.polar + "1".to_c.polar)]
p f[*("1+2i".to_c.polar + "3+4i".to_c.polar)]

Đầu ra

2.221441469079183
1.4142135623730951
1.9999342590038496
1.1996117257705434
3.1660966740274357

2

Toán học 66 byte

Điều này có tọa độ hình chữ nhật và có thể xuất ra một giải pháp biểu tượng chính xác

Min[If[(m=Min[{p,q}=Norm/@#])>0,m*VectorAngle@@#,0]+Abs[p-q],p+q]&

Sử dụng:

%/@{
{{1,1},{1,-1}},
{{0,0},{1,1}},
{{1,0},{-.4161,.90929}},
{{1,1},{1,0}},
{{1,2},{3,4}}
}

sản lượng: kết quả tượng trưng

Lợi nhuận N @%:

{2.221441469, 1.414213562, 1.999934259, 1.199611726, 3.166096674}


1
Tiện lợi! nếu bạn đang đi theo con đường tượng trưng, ​​bạn có thể thay thế trường hợp thử nghiệm {1,0} {-. 4161, .90929} bằng {1,0} {cos (2), sin (2)}
Ando Bando

1

Python 2, 164 126 125 132 byte:

def A(a,b,c,d,p=3.1415926535):z=abs(a-c);M=lambda f:2*p*f*abs(b-d)/360.0;print min((a==c)*min(a+c,M(a))+(b==d)*z or'',M(a)+z,M(c)+z)

Tôi hiện đang xem xét việc chơi golf này nhiều hơn. Chấp nhận tọa độ cực. Nên được gọi theo định dạng A(r1,θ1,r2,θ2). Xuất ra một giá trị dấu phẩy động chính xác đến các 12số liệu quan trọng.

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

Việc triển khai đơn giản, đơn giản để tính toán và xuất ra STDOUT giá trị tối thiểu trong một mảng có tối đa 3 giá trị chứa:

  1. giá trị tối thiểu trong tổng của hai độ dài ( r1+r2) hoặc độ dài của cung nối hai điểm iff r1==r2 ;
  2. sự khác biệt giữa hai khoảng cách ( abs(r1-r2)) iff θ1==θ2 (tức là hai điểm thẳng hàng);
  3. nếu không có mục nào trong 2 mục trước được thêm vào, thì một chuỗi rỗng ( '') như trong Python rõ ràng là một chuỗi lớn hơn bất kỳ số nguyên nào;
  4. và 2 giá trị cuối cùng được đưa ra từ các khoảng cách di chuyển dọc theo một vòng tròn và một tia và ngược lại giữa hai điểm.

Tại sao không math.pi?
dùng202729

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.