Làm các vòng tròn chồng lên nhau?


21

Cho tọa độ của các tâm và bán kính của 2 vòng tròn, đưa ra một giá trị trung thực cho dù chúng có hoặc không trùng nhau.

Đầu vào

  • Đầu vào có thể được lấy thông qua STDIN hoặc tương đương, đối số hàm, nhưng không phải là một biến. Bạn có thể lấy chúng làm một biến duy nhất (danh sách, chuỗi, v.v.) hoặc dưới dạng nhiều đầu vào / đối số, theo bất kỳ thứ tự nào bạn muốn.

  • Đầu vào sẽ là sáu phao. Những chiếc phao này sẽ có tới 3 chữ số thập phân. Các tọa độ có thể là tích cực hoặc tiêu cực. Bán kính sẽ dương.

Đầu ra

  • Đầu ra có thể thông qua STDOUT hoặc trả về chức năng.

  • Chương trình phải có chính xác 2 đầu ra riêng biệt - một cho giá trị True (các vòng tròn trùng nhau) và một cho đầu ra Sai (chúng không trùng nhau).

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

(Đầu vào được đưa ra dưới dạng danh sách các bộ dữ liệu [(x1, y1, r1), (x2, y2, r2)]cho các trường hợp thử nghiệm; bạn có thể lấy đầu vào ở bất kỳ định dạng nào)

Thật

[(5.86, 3.92, 1.670), (11.8, 2.98, 4.571)]
[(8.26, -2.72, 2.488), (4.59, -2.97, 1.345)]
[(9.32, -7.77, 2.8), (6.21, -8.51, 0.4)]

Sai

[(4.59, -2.97, 1.345), (11.8, 2.98, 4.571)]
[(9.32, -7.77, 2.8), (4.59, -2.97, 1.345)]
[(5.86, 3.92, 1.670), (6.21, -8.51, 0.4)]

Đây là Code Golf, câu trả lời ngắn nhất trong các chiến thắng byte.


4
Chúng ta cần phải trả lại những gì nếu hai vòng tròn chạm vào bên ngoài?
JungHwan Min

6
Thuật ngữ kỹ thuật cho "chạm nhưng không chồng chéo" là "tiếp tuyến" và nó là một thứ trong hình học nếu không ở đâu khác.
dmckee

2
Đi phao có vẻ như là một yêu cầu khá nghiêm ngặt. Bạn có thể thư giãn nó để đại diện chung hơn? Tôi muốn giải quyết vấn đề này trong Brain-Flak, nhưng tôi không có khả năng dành thời gian để thực hiện các float của IEEE, và nếu tôi đã làm thì nó sẽ là 90% số byte vì vậy tôi sẽ chỉ chơi golf khi thực hiện float.
Phù thủy lúa mì

4
Tôi cũng muốn chỉ ra rằng phao không chính xác đến "ba chữ số thập phân" trong nhiều trường hợp. Tôi không chắc chính xác những gì bạn muốn câu trả lời để xử lý, nhưng nó hơi khó hiểu ngay bây giờ.
Phù thủy lúa mì

2
Tôi nghĩ rằng bạn có thể có một sự hiểu lầm cơ bản về cách thức hoạt động của phao. Bởi vì chúng có kích thước cố định, khi các giá trị càng lớn, độ chính xác càng thấp. Có một điểm mà trên đó một float không thể biểu diễn chính xác tất cả các giá trị trong 3 vị trí thập phân. Ngoài ra, việc chỉnh sửa một thách thức để loại bỏ một hạn chế không cần thiết không được khuyến khích.
Mego

Câu trả lời:


18

Thạch , 5 byte

IA<S}

Lấy hai số phức (tâm) làm đối số thứ nhất và hai số thực (bán kính) làm đối số thứ hai.

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

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

IA<S}  Main link.
       Left argument:  [x1 + iy1, x2 + iy2]
       Right argument: [r1, r2]

I      Increments; yield (x2 - x1) + i(y2 - y1).
 A     Absolute value; yield √((x2 - x1)² + (y2 - y1)²).
   S}  Take the sum of the right argument, yielding r1 + r2.
  <    Compare the results.

Chết tiệt, tôi quên mất việc sử dụng số phức cho tọa độ. Tốt một! : D
HyperNeutrino

Không quan tâm liệu kết quả Aở đây có được coi là chuẩn mực của "trung tâm" vector không? ( ÆḊbản thân lỗi với nội dung phức tạp.)
Jonathan Allan

1
@Jonathan ALLan Có, Atính khoảng cách của các trung tâm là chỉ tiêu của vectơ khác biệt của chúng.
Dennis

11

JavaScript (ES6), 38 byte

Lấy đầu vào là 6 biến phân biệt x1 , y1 , r1 , x2 , y2 , r2 .

(x,y,r,X,Y,R)=>Math.hypot(x-X,y-Y)<r+R

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


Đối với bất cứ ai không có vẻ như Math.hypot trước đây.
Pureferret


@ V.Courtois Cách bạn truyền tham số không khớp với khai báo phương thức. Nó phải a:Double,x:Double,b:Double,y:Double,r:Double,q:Double.
Arnauld

1
@Arnauld ooh ~ cảm ơn! Tôi có nên đăng nó một cách riêng biệt?
V. Courtois

@ V.Courtois Chắc chắn. Đi cho nó!
Arnauld

7

Bình thường, 5 byte

gsE.a

Định dạng đầu vào:

[x1, y1], [x2, y2]
r1, r2

Dùng thử trực tuyến

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

     Q   autoinitialized to eval(input())
   .a    L2 norm of vector difference of Q[0] and Q[1]
gsE      sum(eval(input()) >= that

7

MATL , 5 byte

ZPis<

Định dạng đầu vào là:

[x1, y1]
[x2, y2]
[r1, r2]

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

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

ZP   % Take two vectors as input. Push their Euclidean distance
i    % Input the vector of radii
s    % Sum of vector
<    % Less than?

Không chắc chắn đó có phải là tôi không, nhưng khi tôi sử dụng liên kết dùng thử của bạn và nhấn chạy, tôi nhận được 'Lỗi Phản hồi của máy chủ không thể giải mã được' - Cũng không chắc là nó có giúp ích gì không, nhưng bạn có nghĩ về (ab) bằng cách sử dụng các số phức như trong câu trả lời Jelly?
Dennis Jaheruddin

@DennisJaheruddin Này, rất vui được gặp lại bạn ở đây! (1) Có thể đổ lỗi cho bộ nhớ đệm. Bạn đã thử làm mới một cách khó khăn? (2) Tôi đã làm, nhưng tôi nghĩ đó cũng là 5byte ( -|thay vì ZP)
Luis Mendo

Tôi cho rằng đó là tường lửa. Bây giờ tôi đang tự hỏi liệu một định dạng đầu vào với một cái gì đó như -r2thay vì r2sẽ giúp ích bởi vì sau đó bạn sẽ cần ba sự khác biệt, thay vì 2 sự khác biệt và một sự bổ sung ... Tôi nên chạy tốt hơn trước khi tôi bị thu hút quá sâu!
Dennis Jaheruddin

Tôi không nghĩ rằng phủ định một đầu vào là chấp nhận được như định dạng đầu vào. Nếu bạn tìm thấy bất kỳ vấn đề nào với dịch vụ Dùng thử trực tuyến, bạn có thể báo cáo tại đây không?
Luis Mendo

6

R , 39 byte

function(k,r)dist(matrix(k,2,2))<sum(r)

lấy đầu vào k=c(x1,x2,y1,y2)r=c(r1,r2); trả về FALSEcho các vòng tròn tiếp tuyến.

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

27 byte:

function(m,r)dist(m)<sum(r)

Đưa đầu vào dưới dạng ma trận với các tâm đường tròn được cho dưới dạng hàng và vectơ bán kính.

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


-2 bytefunction(k,r)dist(matrix(k,2))<sum(r)
djhurio

Thế còn dist(matrix(scan(),2))<sum(scan())?
djhurio

6

Python , 40 byte

lambda x,y,r,X,Y,R:abs(x-X+(y-Y)*1j)<r+R

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

Sử dụng số học phức tạp của Python để tính khoảng cách giữa hai trung tâm. Tôi giả sử rằng chúng ta không thể lấy các điểm đầu vào trực tiếp dưới dạng số phức, vì vậy mã biểu thị chúng như thế nào x+y*1j.





4

APL (Dyalog) , 10 byte

Nhắc cho các tâm vòng tròn là danh sách hai số phức, sau đó cho bán kính là danh sách hai số

(+/⎕)>|-/

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

(+/⎕) [là] tổng của bán kính

> lớn hơn

| độ lớn của

-/⎕ sự khác biệt ở trung tâm


3

Toán học, 16 byte

Norm[#-#2]<+##3&

Đầu vào: [{x1, y1}, {x2, y2}, r1, r2]


Toán học có một RegionIntersection nội trang, nhưng một mình nó dài 18 byte ...

Phiên bản tích hợp:

RegionIntersection@##==EmptyRegion@2&

Mất 2 Diskđối tượng. [Disk[{x1, y1}, r1], Disk[{x2, y2}, r2]].





3

Java 8, 41 38 byte

(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R

Hãy thử nó ở đây.

Rõ ràng, Java cũng có Math.hypot, ngắn hơn 3 byte.

EDIT: Mới nhận ra câu trả lời này bây giờ giống hệt như câu trả lời Java 8 của @ OlivierGrégoire , vì vậy hãy nâng cấp anh ấy thay vì tôi nếu bạn thích câu trả lời 38 byte.

Câu trả lời cũ (41 byte) :

(x,y,r,X,Y,R)->(x-=X)*x+(y-=Y)*y<(r+=R)*r

Hãy thử nó ở đây.


1
Oh! Vì vậy, đó là lý do tại sao tôi nhận được 3 lượt upvote hôm nay, nhưng 0 khi thử thách được đăng? ^^ Tôi đã tự hỏi điều gì đã kích hoạt hành vi kỳ lạ này;) Vì tôi thích câu trả lời của tôi và bạn đã đăng tương tự, bạn cũng nhận được +1! : p
Olivier Grégoire


2

Perl 6 , 13 byte

*+*>(*-*).abs

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

Hai đối số đầu tiên là bán kính, theo thứ tự. Đối số thứ ba và thứ tư là tọa độ của các tâm, dưới dạng số phức, theo thứ tự.


2

Taxi , 1582 byte

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to Tom's Trims.Pickup a passenger going to Tom's Trims.Go to Tom's Trims:n.[a]Go to Post Office:s.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to What's The Difference.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 5 l.Pickup a passenger going to Cyclone.Go to Cyclone:e 1 r.Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Addition Alley.Go to Tom's Trims:s 1 r 3 r.Pickup a passenger going to The Babelfishery.Switch to plan "b" if no one is waiting.Switch to plan "a".[b]Go to Addition Alley:n 1 r 1 l 3 l 1 l.Pickup a passenger going to Magic Eight.Go to Post Office:n 1 r 1 r 3 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 5 l 1 l.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Magic Eight.Go to Magic Eight:s 1 r.Switch to plan "c" if no one is waiting.'1' is waiting at Writer's Depot.[c]'0' is waiting at Writer's Depot.Go to Writer's Depot:w 1 l 2 l.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

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

Đầu ra 1cho các vòng tròn chồng chéo.
Đầu ra 0cho các vòng tròn không chồng chéo (bao gồm các vòng tròn tiếp tuyến).

Ungolfed / định dạng:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to Tom's Trims.
Pickup a passenger going to Tom's Trims.
Go to Tom's Trims: north.
[a]
Go to Post Office: south.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to What's The Difference.
Pickup a passenger going to What's The Difference.
Go to What's The Difference: north 5th left.
Pickup a passenger going to Cyclone.
Go to Cyclone: east 1st right.
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: south 1st left 2nd right 4th left.
Pickup a passenger going to Addition Alley.
Go to Tom's Trims: south 1st right 3rd right.
Pickup a passenger going to The Babelfishery.
Switch to plan "b" if no one is waiting.
Switch to plan "a".
[b]
Go to Addition Alley: north 1st right 1st left 3rd left 1st left.
Pickup a passenger going to Magic Eight.
Go to Post Office: north 1st right 1st right 3rd right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: north 5th left 1st left.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left.
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: south 1st left 2nd right 4th left.
Pickup a passenger going to Magic Eight.
Go to Magic Eight: south 1st right.
Switch to plan "c" if no one is waiting.
'1' is waiting at Writer's Depot.
[c]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: west 1st left 2nd left.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

2

C #, 50 41 byte

(x,y,r,X,Y,R)=>(x-=X)*x+(y-=Y)*y<(r+=R)*r

Đã lưu 9 byte nhờ @KevinCruijssen.


Bạn không thể lưu một vài byte ở đó bằng cách viết (r+R)*2thay vì (r+R)+(r+R)?
Ian H.

@IanH. Vâng không biết làm thế nào tôi bỏ lỡ điều đó.
TheLethalCoder

Tôi đang thiếu một cái gì đó hoặc điều này không hoạt động ?
Ian H.

@IanH. Tôi đã mắc lỗi đánh máy, +trên RHS nên là một *.
TheLethalCoder

Và phản hồi của tôi thậm chí còn làm cho điều đó tồi tệ hơn. Tốt công việc về giải pháp mặc dù!
Ian H.


1

PostgreSQL, 41 ký tự

prepare f(circle,circle)as select $1&&$2;

Tuyên bố đã chuẩn bị, lấy đầu vào là 2 tham số trong bất kỳ circleký hiệu nào .

Chạy mẫu:

Tuples only is on.
Output format is unaligned.
psql (9.6.3, server 9.4.8)
Type "help" for help.

psql=# prepare f(circle,circle)as select $1&&$2;
PREPARE

psql=# execute f('5.86, 3.92, 1.670', '11.8, 2.98, 4.571');
t

psql=# execute f('8.26, -2.72, 2.488', '4.59, -2.97, 1.345');
t

psql=# execute f('9.32, -7.77, 2.8', '6.21, -8.51, 0.4');
t

psql=# execute f('4.59, -2.97, 1.345', '11.8, 2.98, 4.571');
f

psql=# execute f('9.32, -7.77, 2.8', '4.59, -2.97, 1.345');
f

psql=# execute f('5.86, 3.92, 1.670', '6.21, -8.51, 0.4');
f

1

Java, 50 38 byte

(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R

Sử dụng ý tưởng trong các câu trả lời khác, điều này có thể được rút ngắn xuống còn 38 như vậy : (x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R. Trên thực tế, chỉ cần nhận ra đây là chính xác như câu trả lời JavaScript của Arnauld.
laszlok

Cảm ơn ... Câu trả lời này là nevee dự định chơi gôn ... tôi nghĩ rằng đó là một thử thách đơn giản như vậy sẽ không có bất cứ điều gì có thể được đánh gôn ...
Roman Gräf

Tôi e rằng câu trả lời của bạn bây giờ giống hệt như câu trả lời đã được đăng bởi @ OlivierGrégoire ..
Kevin Cruijssen

1

Mã máy x86 (với SSE2), 36 byte

; bool CirclesOverlap(double x1, double y1, double r1,
;                     double x2, double y2, double r2);
F2 0F 5C C3        subsd   xmm0, xmm3      ; x1 - x2
F2 0F 5C CC        subsd   xmm1, xmm4      ; y1 - y2
F2 0F 58 D5        addsd   xmm2, xmm5      ; r1 + r2
F2 0F 59 C0        mulsd   xmm0, xmm0      ; (x1 - x2)^2
F2 0F 59 C9        mulsd   xmm1, xmm1      ; (y1 - y2)^2
F2 0F 59 D2        mulsd   xmm2, xmm2      ; (r1 + r2)^2
F2 0F 58 C1        addsd   xmm0, xmm1      ; (x1 - x2)^2 + (y1 - y2)^2
66 0F 2F D0        comisd  xmm2, xmm0
0F 97 C0           seta    al              ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3                 ret

Hàm trên chấp nhận mô tả của hai vòng tròn (tọa độ x và y của điểm trung tâm và bán kính) và trả về giá trị Boolean cho biết chúng có giao nhau hay không.

Nó sử dụng quy ước gọi vectơ, trong đó các tham số được truyền trong các thanh ghi SIMD. Trên Windows x86-32 và 64 bit, đây là __vectorcallquy ước gọi . Trên Unix / Linux / Gnu 64 bit, đây là quy ước gọi System64 AMD V tiêu chuẩn .

Giá trị trả về được để lại trong byte thấp của EAX , như là tiêu chuẩn với tất cả các quy ước gọi x86.

Mã này hoạt động tốt như nhau trên các bộ xử lý x86 32 bit và 64 bit, miễn là chúng hỗ trợ tập lệnh SSE2 (sẽ là Intel Pentium 4 trở lên, hoặc AMD Athlon 64 trở lên).

Phiên bản AVX, vẫn còn 36 byte

Nếu bạn đang nhắm mục tiêu AVX , có lẽ bạn sẽ muốn thêm tiền tố VEX vào hướng dẫn. Điều này không thay đổi số byte; chỉ các byte thực tế được sử dụng để mã hóa các hướng dẫn:

; bool CirclesOverlap(double x1, double y1, double r1,
;                     double x2, double y2, double r2);
C5 FB 5C C3      vsubsd   xmm0, xmm0, xmm3   ; x1 - x2
C5 F3 5C CC      vsubsd   xmm1, xmm1, xmm4   ; y1 - y2
C5 EB 58 D5      vaddsd   xmm2, xmm2, xmm5   ; r1 + r2
C5 FB 59 C0      vmulsd   xmm0, xmm0, xmm0   ; (x1 - x2)^2
C5 F3 59 C9      vmulsd   xmm1, xmm1, xmm1   ; (y1 - y2)^2
C5 EB 59 D2      vmulsd   xmm2, xmm2, xmm2   ; (r1 + r2)^2
C5 FB 58 C1      vaddsd   xmm0, xmm0, xmm1   ; (x1 - x2)^2 + (y1 - y2)^2
C5 F9 2F D0      vcomisd  xmm2, xmm0
0F 97 C0         seta     al                 ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3               ret

Các hướng dẫn AVX có lợi thế là lấy ba toán hạng, cho phép bạn thực hiện các hoạt động không phá hủy, nhưng điều đó không thực sự giúp chúng tôi thu gọn mã bất kỳ ở đây. Tuy nhiên, việc trộn các hướng dẫn có và không có tiền tố VEX có thể dẫn đến mã tối ưu phụ, do đó, bạn thường muốn tuân theo tất cả các hướng dẫn AVX nếu bạn đang nhắm mục tiêu AVX và trong trường hợp này, nó thậm chí không làm tổn hại đến số byte của bạn.



1

PHP , 66 byte

<?php $i=$argv;echo hypot($i[1]-$i[4],$i[2]-$i[5])<$i[3]+$i[6]?:0;

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

Chạy từ dòng lệnh, lấy đầu vào là 6 đối số tham số dòng lệnh và in 1 nếu các vòng tròn trùng nhau, khác 0.


0

Julia 0,6.0 (46 byte)

a->((a[1]-a[2])^2+(a[3]-a[4])^2<(a[5]+a[6])^2)

0

Clojure, 68 byte

#(<(+(*(- %4 %)(- %4 %))(*(- %5 %2)(- %5 %2)))(*(+ %6 %3)(+ %6 %3)))

Có sáu đối số: x1, y1, r1, x2, y2, r2. Trả về đúng hay sai.

Đáng buồn thay, Clojure không có powchức năng của một số loại. Chi phí rất nhiều byte.


0

Trên thực tế , 8 byte

-)-(h@+>

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

Giải trình:

-)-(h@+>  (implicit input: [y1, y2, x1, x2, r1, r2])
-         y2-y1 ([y2-y1, x1, x2, r1, r2])
 )-       move to bottom, x1-x2 ([x1-x2, r1, r2, y2-y1])
   (h     move from bottom, Euclidean norm ([sqrt((y2-y1)**2+(x2-x1)**2), r1, r2])
     @+   r1+r2 ([r1+r2, norm])
       >  is r1+r2 greater than norm?

0

R (+ pryr), 31 byte

pryr::f(sum((x-y)^2)^.5<sum(r))

Mà đánh giá chức năng

function (x, y, z) 
sum((x - y)^2)^0.5 < sum(z)

Trong đó xtọa độ của vòng tròn 1, ylà tọa độ của vòng tròn 2 vàz bán kính.

Tính khoảng cách giữa hai trung tâm bằng Pythagoras và kiểm tra nếu khoảng cách đó nhỏ hơn tổng bán kính.

Làm cho việc sử dụng véc tơ của R để tính toán đồng thời (x1-x2)^2(y1-y2)^2. Chúng sau đó được tóm tắt và bắt nguồn từ rễ.


0

Đi , 93 byte

package q
import c "math/cmplx"
func o(a,b complex128,r,R float64)bool{return c.Abs(b-a)<r+R}

Thuật toán khá đơn giản, giống như một số câu trả lời khác, ngoại trừ nó sử dụng kiểu dựng sẵn complexvà gọi math / cmplx.Abs ().

Lấy bán kính làm số phức không giúp được gì, bởi vì việc chuyển sang float64 thêm nhiều byte hơn so với khai báo biến (không thể thực hiện float64 < complex128).

Hãy thử trực tuyến! Bao gồm các trường hợp thử nghiệm và sử dụng gói chính thay vì thư viện.

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.