Apakah lingkaran tumpang tindih?


21

Mengingat koordinat pusat dan jari-jari 2 lingkaran, menghasilkan nilai kebenaran apakah mereka tumpang tindih atau tidak.

Memasukkan

  • Input dapat diambil melalui STDIN atau argumen fungsi yang setara, tetapi tidak sebagai variabel. Anda dapat mengambilnya sebagai variabel tunggal (daftar, string, dll) atau sebagai beberapa input / argumen, dalam urutan apa pun yang Anda inginkan.

  • Input akan menjadi enam float. Pelampung ini akan mencapai 3 desimal. Koordinat bisa positif atau negatif. Jari-jari akan positif.

Keluaran

  • Output bisa melalui STDOUT atau fungsi kembali.

  • Program harus memiliki tepat 2 output berbeda - satu untuk nilai True (lingkaran melakukan tumpang tindih) dan satu untuk output False (mereka tidak tumpang tindih).

Uji kasus

(Input diberikan sebagai daftar tupel [(x1, y1, r1), (x2, y2, r2)]untuk kasus uji; Anda dapat mengambil input dalam format apa pun)

Benar

[(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)]

Salah

[(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)]

Ini adalah Code Golf, jawaban terpendek dalam byte yang menang.


4
Apa yang perlu kita kembalikan jika dua lingkaran bersentuhan secara eksternal?
JungHwan Min

6
Istilah teknis untuk "menyentuh tetapi tidak tumpang tindih" adalah "singgung" dan itu adalah sesuatu dalam geometri jika tidak ada tempat lain.
dmckee

2
Mengambil pelampung sepertinya persyaratan yang cukup ketat. Bisakah Anda mengendurkannya ke representasi yang lebih umum? Saya ingin menyelesaikan ini di Brain-Flak, tapi saya tidak mungkin meluangkan waktu untuk mengimplementasikan IEEE float, dan jika saya melakukannya akan menjadi 90% dari jumlah byte, jadi saya hanya akan bermain golf implementasi float.
Wheat Wizard

4
Saya juga ingin menunjukkan bahwa mengapung tidak akurat hingga "tiga tempat desimal" dalam banyak kasus. Saya tidak yakin persis apa yang Anda inginkan untuk dijawab, tetapi ini sedikit membingungkan sekarang.
Wheat Wizard

2
Saya pikir Anda mungkin memiliki kesalahpahaman mendasar tentang cara kerja pelampung. Karena mereka berukuran tetap, karena nilainya semakin besar, presisi semakin rendah. Ada titik di mana float tidak dapat secara akurat mewakili semua nilai dalam 3 tempat desimal. Juga, mengedit tantangan untuk menghapus batasan yang tidak perlu tidak dianjurkan.
Mego

Jawaban:


18

Jelly , 5 byte

IA<S}

Membawa dua bilangan kompleks (tengah) sebagai argumen pertama, dan dua bilangan real (jari-jari) sebagai argumen kedua.

Cobalah online!

Bagaimana itu bekerja

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.

Sial, saya lupa tentang menggunakan bilangan kompleks untuk koordinat. Bagus : D
HyperNeutrino

Yang tidak menarik, apakah hasil dari Asini akan dianggap sebagai norma dari vektor baris "tengah"? ( ÆḊKesalahan itu sendiri dengan konten yang kompleks.)
Jonathan Allan

1
@ JonathanAllan Ya, Amenghitung jarak pusat sebagai norma dari vektor perbedaan mereka.
Dennis

11

JavaScript (ES6), 38 byte

Mengambil input sebagai 6 variabel berbeda x1 , y1 , r1 , x2 , y2 , r2 .

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

Uji kasus


Untuk siapa saja yang belum pernah melihat Math.hypot sebelumnya.
Pureferret


@ V.Courtois Cara Anda melewatkan parameter tidak cocok dengan deklarasi metode. Seharusnya begitu a:Double,x:Double,b:Double,y:Double,r:Double,q:Double.
Arnauld

1
@Arnauld ooh ~ terima kasih! Haruskah saya mempostingnya secara terpisah?
V. Courtois

@ V.Courtois Tentu. Lakukan itu!
Arnauld

7

Pyth, 5 byte

gsE.a

Masukkan format:

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

Cobalah online

Bagaimana itu bekerja

     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<

Format input adalah:

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

Cobalah online! Atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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

Tidak yakin apakah ini saya, tetapi ketika saya menggunakan tautan uji coba dan tekan jalankan, saya mendapatkan 'Kesalahan. Respons server tidak dapat diterjemahkan' - Juga Tidak yakin apakah itu membantu, tetapi apakah Anda berpikir tentang (ab) menggunakan nomor kompleks seperti dalam jawaban Jelly?
Dennis Jaheruddin

@DennisJaheruddin Hei, senang bertemu denganmu lagi di sini! (1) Menyalahkan caching, mungkin. Apakah Anda mencoba menyegarkan? (2) Saya lakukan, tapi saya pikir itu juga 5byte ( -|bukan ZP)
Luis Mendo

Saya kira itu adalah firewall. Sekarang saya bertanya-tanya apakah format input dengan sesuatu seperti -r2bukannya r2akan membantu karena Anda akan memerlukan tiga perbedaan, bukan 2 perbedaan dan tambahan ... Saya lebih baik menjalankan sebelum saya ditarik terlalu dalam!
Dennis Jaheruddin

Saya tidak berpikir bahwa meniadakan satu input dapat diterima sebagai format input. Jika Anda menemukan masalah dengan layanan Try It Online, maukah Anda melaporkan di sini ?
Luis Mendo

6

R , 39 byte

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

membutuhkan input k=c(x1,x2,y1,y2) dan r=c(r1,r2); kembali FALSEuntuk lingkaran singgung.

Cobalah online!

27 byte:

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

Mengambil input sebagai matriks dengan pusat lingkaran diberikan sebagai baris dan vektor jari-jari.

Cobalah online!


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

Bagaimana dengan 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

Cobalah online!

Menggunakan aritmatika Python yang rumit untuk menghitung jarak antara dua pusat. Saya berasumsi kita tidak bisa mengambil titik input langsung sebagai angka kompleks, jadi kodenya seperti itu x+y*1j.





4

APL (Dyalog) , 10 byte

Meminta pusat lingkaran sebagai daftar dua bilangan kompleks, lalu untuk jari-jari sebagai daftar dua bilangan

(+/⎕)>|-/

Cobalah online!

(+/⎕) Adalah jumlah jari-jari

> lebih besar dari

| besarnya

-/⎕ perbedaan pusat


3

Mathematica, 16 byte

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

Memasukkan: [{x1, y1}, {x2, y2}, r1, r2]


Mathematica memiliki RegionIntersectionbuiltin, tapi itu saja panjangnya 18 byte ...

Versi bawaan:

RegionIntersection@##==EmptyRegion@2&

Membawa 2 Diskobjek. [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

Coba di sini.

Rupanya, Java juga memiliki Math.hypot, yaitu 3 byte lebih pendek.

EDIT: Baru menyadari jawaban ini sekarang persis sama dengan jawaban Java 8 @ OlivierGrégoire , jadi harap balas dia daripada saya jika Anda suka jawaban 38 byte.

Jawaban lama (41 byte) :

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

Coba di sini.


1
Oh! Jadi itu sebabnya saya mendapat 3 upvotes hari ini, tetapi 0 ketika tantangan diposting? ^^ Saya bertanya-tanya apa yang memicu perilaku aneh ini;) Karena saya menyukai jawaban saya, dan Anda memposting yang sama, Anda mendapatkan +1 juga! : p
Olivier Grégoire


2

Perl 6 , 13 byte

*+*>(*-*).abs

Cobalah online!

Dua argumen pertama adalah jari-jari, dalam urutan mana pun. Argumen ketiga dan keempat adalah koordinat pusat, sebagai bilangan kompleks, dalam urutan apa pun.


2

Taksi , 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.

Cobalah online!

Output 1untuk lingkaran yang tumpang tindih.
Output 0untuk lingkaran yang tidak tumpang tindih (termasuk lingkaran tangensial).

Tidak diikat / diformat:

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

Disimpan 9 byte berkat @KevinCruijssen.


Tidak bisakah Anda menyimpan beberapa byte di sana dengan menulis (r+R)*2alih-alih (r+R)+(r+R)?
Ian H.

@IanH. Ya tidak tahu bagaimana saya melewatkan itu.
TheLethalCoder

Apakah saya kehilangan sesuatu atau ini tidak berhasil ?
Ian H.

@IanH. Saya membuat kesalahan ketik, +pada RHS seharusnya menjadi *.
TheLethalCoder

Dan tanggapan saya bahkan membuat itu lebih buruk. Kerja bagus di solusinya!
Ian H.


1

PostgreSQL, 41 karakter

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

Pernyataan siap, mengambil input sebagai 2 parameter dalam circlenotasi apa pun .

Contoh dijalankan:

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

Menggunakan ide-ide dalam jawaban lain, ini dapat disingkat menjadi 38 seperti: (x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R. Faktanya, baru menyadari ini sama persis dengan jawaban JavaScript Arnauld.
laszlok

Terima kasih ... Jawaban ini tidak dimaksudkan untuk golf ... saya pikir itu adalah tantangan yang sederhana tidak akan ada apa pun yang bisa bermain golf ...
Roman Gräf

Saya khawatir jawaban Anda sekarang persis sama dengan jawaban yang sudah diposting oleh @ OlivierGrégoire ..
Kevin Cruijssen

1

Kode Mesin x86 (dengan 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

Fungsi di atas menerima deskripsi dua lingkaran (koordinat x dan y dari titik pusat dan jari-jari), dan mengembalikan nilai Boolean yang menunjukkan apakah mereka berpotongan atau tidak.

Menggunakan konvensi pemanggilan vektor, di mana parameter dilewatkan dalam register SIMD. Pada x86-32 dan 64-bit Windows, ini adalah __vectorcallkonvensi pemanggilan . Pada Unix / Linux / Gnu 64-bit, ini adalah konvensi pemanggilan Sistem V AMD64 standar .

Nilai kembali dibiarkan dalam byte rendah EAX, seperti standar dengan semua konvensi pemanggilan x86.

Kode ini berfungsi dengan baik pada prosesor x86 32-bit dan 64-bit, selama mereka mendukung set instruksi SSE2 (yang akan menjadi Intel Pentium 4 dan yang lebih baru, atau AMD Athlon 64 dan yang lebih baru).

Versi AVX, masih 36 byte

Jika Anda menargetkan AVX , Anda mungkin ingin menambahkan awalan VEX ke instruksi. Ini tidak mengubah jumlah byte; hanya byte aktual yang digunakan untuk menyandikan instruksi:

; 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

Instruksi AVX memiliki keuntungan dengan mengambil tiga operan, memungkinkan Anda untuk melakukan operasi yang tidak merusak, tetapi itu tidak benar-benar membantu kami untuk memadatkan kode di sini. Namun, mencampur instruksi dengan dan tanpa awalan VEX dapat menghasilkan kode yang kurang optimal, jadi Anda biasanya ingin tetap menggunakan semua instruksi AVX jika Anda menargetkan AVX, dan dalam hal ini, bahkan tidak akan mengganggu jumlah byte Anda.



1

PHP , 66 byte

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

Cobalah online!

Berjalan dari baris perintah, mengambil input sebagai 6 argumen parameter baris perintah, dan mencetak 1 jika lingkaran tumpang tindih, atau 0.


0

Julia 0.6.0 (46 bytes)

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

Membawa enam argumen: x1, y1, r1, x2, y2, r2. Mengembalikan nilai true atau false.

Sedihnya, Clojure tidak memiliki powfungsi semacam itu. Biaya banyak byte.


0

Sebenarnya , 8 byte

-)-(h@+>

Cobalah online!

Penjelasan:

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

Yang mengevaluasi fungsi

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

Di mana xkoordinat lingkaran 1, yadalah koordinat lingkaran 2 danz jari-jari.

Hitung jarak antara dua pusat menggunakan Pythagoras dan uji apakah jarak itu lebih kecil dari jumlah jari-jari.

Memanfaatkan vektorisasi R untuk menghitung (x1-x2)^2dan (y1-y2)^2. Ini kemudian dijumlahkan dan berakar tepat.


0

Pergi , 93 byte

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

Algoritma yang cukup sederhana, sama dengan beberapa jawaban lain, kecuali ia menggunakan complextipe bawaan dan memanggil math / cmplx.Abs ().

Mengambil jari-jari sebagai bilangan kompleks tidak membantu, karena para pemain ke float64 menambahkan lebih banyak byte daripada yang disimpan oleh deklarasi variabel (tidak bisa dilakukan float64 < complex128).

Cobalah online! Termasuk kasus uji, dan menggunakan paket utama bukan perpustakaan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.