Daireler örtüşüyor mu?


21

Merkezlerin koordinatları ve 2 dairenin yarıçapı göz önüne alındığında, üst üste binmeleri ya da üst üste binmemeleri gerçeğinin bir değeri verilir.

Giriş

  • Girdi, STDIN veya eşdeğeri, işlev argümanları aracılığıyla alınabilir ancak değişken olarak alınamaz. Bunları istediğiniz sırayla tek bir değişken (liste, string vs.) veya çoklu giriş / argüman olarak alabilirsiniz.

  • Giriş altı kayan olacaktır. Bu yüzen 3 ondalık basamağa kadar olacak. Koordinatlar pozitif veya negatif olabilir. Yarıçaplar pozitif olacaktır.

Çıktı

  • Çıkış STDOUT veya fonksiyon dönüşü üzerinden olabilir.

  • Programın tam olarak 2 ayrı çıktısı olmalı - biri Gerçek değer için (daireler üst üste biner) ve biri yanlış çıktı için (üst üste binmezler).

Test durumları

(Giriş, [(x1, y1, r1), (x2, y2, r2)]test senaryoları için tuples listesi olarak verilir ; istediğiniz formatta giriş yapabilirsiniz)

Doğru

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

Yanlış

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

Bu Code Golf, baytlarda kazanılan en kısa cevap.


4
İki daire harici olarak temas ediyorsa ne döndürmemiz gerekir?
JungHwan Min

6
“Dokunmakla ama örtüşmemek” için kullanılan teknik terim “teğet” tir ve başka bir yerde değilse geometride bir şeydir.
dmckee

2
Float almak oldukça katı bir gereksinim gibi görünüyor. Daha genel bir gösterime gevşetebilir misiniz? Bunu Brain-Flak'ta çözmek istiyorum, ancak IEEE yüzme havuzlarını uygulamak için zaman ayırmayacağım ve bunu yaparsam yine de bayt sayısının% 90'ı olacaktı, bu yüzden sadece bir şamandıra uygulamasına girecektim.
Buğday Sihirbazı

4
Ayrıca, birçok durumda yüzenlerin "üç ondalık basamağa" kadar doğru olmadığını da belirtmek isterim. Cevapların tam olarak ne ele almasını istediğinden emin değilim, ama şu anda biraz kafa karıştırıcı.
Buğday Sihirbazı,

2
Yüzenlerin nasıl çalıştığıyla ilgili temel bir yanlış anlaşılma olabileceğini düşünüyorum. Sabit boyutta olduklarından, değerler büyüdükçe, hassasiyet düşer. Bir şamandıranın 3 ondalık basamaktaki tüm değerleri doğru şekilde temsil edemediği bir nokta var. Ayrıca, gereksiz bir kısıtlamayı kaldırmak için bir zorluk düzenlemek de önerilmez.
Mego,

Yanıtlar:


18

Jöle , 5 bayt

IA<S}

İlk argüman olarak iki karmaşık sayı (merkez) ve ikinci argüman olarak iki gerçek sayı (yarıçap) alır.

Çevrimiçi deneyin!

Nasıl çalışır

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.

Kahretsin, koordinatlar için karmaşık sayıları kullanmayı unuttum. İyi bir! : D
HyperNeutrino

ABurada ortaya çıkan sonuç, "merkezler" sıra vektörünün normu sayılabilir mi? ( ÆḊkendisi karmaşık içerikli hatalar yapar.)
Jonathan Allan

1
@JonathanAllan Evet, Amerkezlerin uzaklıklarını fark vektörlerinin normu olarak hesaplar.
Dennis,

11

JavaScript (ES6), 38 bayt

Girdiyi 6 ayrı değişken olarak alır x1 , y1 , r1 , x2 , y2 , r2 .

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

Test durumları


Daha önce Math.hypot görünmeyen herkes için .
Pureferret


@ V.Courtois Parametreleri iletme şekliniz yöntem bildirimi ile eşleşmiyor. Olmalı a:Double,x:Double,b:Double,y:Double,r:Double,q:Double.
Arnauld,

1
@Arnauld ooh ~ teşekkürler! Ayrı olarak göndermeli miyim?
V. Courtois,

@ V.Courtois Tabii. Göreyim seni!
Arnauld,

7

Pyth, 5 bayt

gsE.a

Giriş formatı:

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

Çevrimiçi deneyin

Nasıl çalışır

     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 bayt

ZPis<

Giriş formatı:

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

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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

Benim olup olmadığından emin değilim, ancak deneme bağlantınızı kullanıp çalıştır düğmesine bastığımda 'Hata Sunucunun yanıtının kodu çözülemedi' mesajı alıyorum - Ayrıca yardımcı olup olmadığından da emin değilsiniz (ab) gibi karmaşık sayılar kullanmayı düşündünüz mü Jelly cevabında?
Dennis Jaheruddin

@DennisJaheruddin Hey, sizi burada tekrar görmek güzel! (1) Muhtemelen önbelleğe almayı suçla. Sert bir yenileme denediniz mi? (2) Yaptım, ama bence de 5bayt ( -|yerine ZP)
Luis Mendo

Sanırım güvenlik duvarı. Şimdi -r2bunun yerine bunun gibi bir giriş formatının işe yarayıp yaramadığını merak ediyorum , r2çünkü o zaman 2 fark ve bir ekleme yerine üç farklılığa ihtiyacınız olacak ... Çok derinlemesine dalmadan önce koşsam daha iyi olur!
Dennis Jaheruddin

Bir girişi olumsuzlamanın giriş biçimi olarak kabul edilebilir olduğunu sanmıyorum. Çevrimiçi Deneyin servisiyle ilgili herhangi bir sorun bulursanız, lütfen burada rapor eder misiniz ?
Luis Mendo,

6

R , 39 bayt

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

girdi alır k=c(x1,x2,y1,y2)ve r=c(r1,r2); dönerFALSEteğet daireler için .

Çevrimiçi deneyin!

27 bayt:

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

Satır olarak verilen daire merkezleriyle ve bir yarıçap vektörüyle matris olarak girdi alır.

Çevrimiçi deneyin!


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

Ne hakkında dist(matrix(scan(),2))<sum(scan())?
djhurio

6

Python , 40 bayt

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

Çevrimiçi deneyin!

İki merkez arasındaki mesafeyi hesaplamak için Python'un karmaşık aritmetiğini kullanır. Giriş noktalarını doğrudan karmaşık sayılar olarak kabul edemeyeceğimizi farz ediyorum, bu yüzden kod onları ifade ediyor x+y*1j.





4

APL (Dyalog) , 10 bayt

İki merkezli sayılar listesi olarak daire merkezlerine, ardından iki sayılar listesi olarak yarıçaplar

(+/⎕)>|-/

Çevrimiçi deneyin!

(+/⎕) [yarıçapı toplamı

> daha büyük

| büyüklüğü

-/⎕ merkezlerdeki fark


3

Mathematica, 16 bayt

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

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


Mathematica’da bir RegionIntersection yerleşik bir yapısı var, ancak bu yalnızca 18 bayt uzunluğunda ...

Dahili versiyon:

RegionIntersection@##==EmptyRegion@2&

2 Disknesneyi alır. [Disk[{x1, y1}, r1], Disk[{x2, y2}, r2]].





3

Java 8, 41 38 bayt

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

Burada dene.

Görünüşe göre, Java da vardır Math.hypot 3 bayt daha kısa olan vardır.

EDIT: Sadece bu cevabın şimdi tam olarak @ OlivierGrégoire Java 8 cevabı ile aynı olduğunu fark ettim. , bu yüzden 38 baytlık cevabı beğenirseniz, lütfen benim yerime oy verin.

Eski cevap (41 bayt) :

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

Burada dene.


1
Ah! Demek bu yüzden bugün 3 oy aldım, fakat meydan okunduğunda 0 mı? ^^ Bu tuhaf davranışı neyin tetiklediğini merak ediyordum;) Cevabımı sevdiğimden ve siz de aynısını gönderdiğinizden, + 1 de alıyorsunuz! : p
Olivier Grégoire


2

Perl 6 , 13 bayt

*+*>(*-*).abs

Çevrimiçi deneyin!

İlk iki argüman her iki sırada da yarıçaplar. Üçüncü ve dördüncü argümanlar merkezlerin koordinatlarıdır, her iki sırayla karmaşık sayılardır.


2

Taksi , 1582 bayt

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.

Çevrimiçi deneyin!

1Örtüşen halkalar için çıktılar .
çıktılar0 daireler için (teğet daireler dahil) .

Ungolfed / biçimlendirilmiş:

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 bayt

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

@KevinCruijssen sayesinde 9 bayt kaydedildi.


Orada birkaç byte'ı (r+R)*2yerine yazarak kaydedemez misiniz (r+R)+(r+R)?
Ian H.

@IanH. Evet, nasıl özlediğimi bilmiyorum.
TheLethalCoder

Bir şey mi eksik veya bu işe yaramıyor mu?
Ian H.

@IanH. Bir yazım hatası yaptım +, RHS'de bir olmalıydı *.
TheLethalCoder

Ve geri bildirimlerim daha da kötüleşti. Yine de çözümde iyi iş!
Ian H.


1

PostgreSQL, 41 karakter

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

Hazırlanan deyim, herhangi bir circlenotasyonda 2 parametre olarak girdi alır .

Örnek çalışma:

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 bayt

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

Diğer yanıtlar fikirleri kullanarak, bu yüzden böyle 38'e kısaltılabilir: (x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R. Aslında, bunun farkının Arnauld'un JavaScript cevabı ile aynı olduğunu farkettim.
laszlok

Teşekkürler ... Bu cevap nevee golfed düşünülmüştü ... ben böyle basit bir meydan okuma bir şey olmaz sanıyordum olabilir ... golfed edilecek
Roman Graf

Ben cevap şimdi tam olarak aynı olduğunu korkuyorum zaten yayınlanmıştır cevap @ OlivierGrégoire ..
Kevin Cruijssen

1

x86 Makine Kodu (SSE2 ile), 36 bayt

; 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

Yukarıdaki işlev, iki dairenin tanımlarını kabul eder (merkez nokta ve yarıçapın x ve y koordinatları) ve kesişip kesip atmadıklarını gösteren bir Boolean değeri döndürür.

Parametrelerin SIMD kayıt defterlerine iletildiği bir vektör arama kuralını kullanır. X86-32 ve 64-bit Windows'ta bu, __vectorcallçağrı sözleşmesidir . 64-bit Unix / Linux / Gnu’da, standart System V AMD64 çağrı kuralı budur .

Dönüş değeri, EAXtüm x86 arama kurallarında standart olduğu gibi düşük baytta bırakılır .

Bu kod, SSE2 komut setini destekledikleri sürece (Intel Pentium 4 ve üstü ya da AMD Athlon 64 ve üstü olacak) 32 bit ve 64 bit x86 işlemcilerde aynı derecede iyi çalışır .

AVX sürümü, hala 36 bayt

Eğer hedefliyorduysa, AVX , muhtemelen talimatlara bir VEX önek eklemek isterim. Bu, bayt sayısını değiştirmez; sadece talimatları kodlamak için kullanılan gerçek baytlar:

; 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

AVX komutları, üç opera alma avantajına sahiptir , tahribatsız işlemler yapmanıza olanak tanır, ancak bu gerçekten de buradaki herhangi bir kodu sıkıştırmamıza yardımcı olmaz. Bununla birlikte, VEX önekleri olan ve olmayan talimatların karıştırılması en uygun alt kodla sonuçlanabilir, bu nedenle, eğer AVX’i hedefliyorsanız, genel olarak tüm AVX komutlarına uymak istersiniz ve bu durumda bayt sayınıza bile zarar vermez.



1

PHP , 66 bayt

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

Çevrimiçi deneyin!

Girdiyi 6 komut satırı parametresi argümanı olarak alarak komut satırından çalıştırır ve daireler üst üste binerse 0 yazar.


0

Julia 0.6.0 (46 bayt)

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

0

Clojure, 68 bayt

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

Altı argüman alır: x1, y1, r1, x2, y2, r2. Doğru ya da yanlış döndürür.

Ne yazık ki, Clojure powbazı tür bir işlevi yoktur. Çok fazla bayt maliyeti.


0

Aslında 8 bayt

-)-(h@+>

Çevrimiçi deneyin!

Açıklama:

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

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

İşleve değer veren

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

x1. dairenin koordinatları nerede , y2. dairenin ve zyarıçapların koordinatlarıdır .

Pisagor kullanarak iki merkez arasındaki mesafeyi hesaplar ve bu mesafenin yarıçapın toplamından küçük olup olmadığını test eder.

Markalar eşzamanlı hesaplamak için R'ın vektorızasyon kullanımı (x1-x2)^2ve (y1-y2)^2. Bunlar daha sonra toplanır ve karelere dayanır.


0

Git , 93 bayt

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

complexYerleşik türünü kullanması ve math / cmplx.Abs () işlevini çağırması dışında, diğer birkaç yanıtla aynı oldukça basit bir algoritma .

Taking the radii as complex numbers doesn't help, because the cast to float64 adds more bytes than the variable declaration saves (can't do float64 < complex128).

Try it online! Includes the test cases, and uses package main instead of a library.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.