Les cercles se chevauchent-ils?

21

Étant donné les coordonnées des centres et les rayons de 2 cercles, affichez une valeur vraie de s'ils se chevauchent ou non.

Contribution

  • L'entrée peut être prise via STDIN ou équivalent, des arguments de fonction, mais pas sous forme de variable. Vous pouvez les prendre comme une seule variable (liste, chaîne, etc.) ou comme plusieurs entrées / arguments, dans l'ordre que vous souhaitez.

  • L'entrée sera six flottants. Ces flottants auront jusqu'à 3 décimales. Les coordonnées peuvent être positives ou négatives. Les rayons seront positifs.

Production

  • La sortie peut être via STDOUT ou retour de fonction.

  • Le programme doit avoir exactement 2 sorties distinctes - une pour une valeur vraie (les cercles se chevauchent) et une pour une sortie fausse (elles ne se chevauchent pas).

Cas de test

(L'entrée est donnée sous forme de liste de tuples [(x1, y1, r1), (x2, y2, r2)]pour les cas de test; vous pouvez prendre l'entrée dans n'importe quel format)

Vrai

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

Faux

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

C'est Code Golf, la réponse la plus courte en victoires en octets.

Tim
la source
4
Que devons-nous retourner si deux cercles se touchent extérieurement?
JungHwan Min
6
Le terme technique pour «toucher mais ne pas se chevaucher» est «tangent» et c'est une chose en géométrie si nulle part ailleurs.
dmckee
2
Prendre des flotteurs semble être une exigence assez stricte. Pourriez-vous l'assouplir à une représentation plus générale? Je voudrais résoudre ce problème dans Brain-Flak, mais il est peu probable que je prenne le temps d'implémenter des flottants IEEE, et si je le faisais, ce serait 90% du nombre d'octets de toute façon, donc je jouerais simplement une implémentation flottante.
Wheat Wizard
4
Je voudrais également souligner que les flottants ne sont pas précis jusqu'à "trois décimales" dans de nombreux cas. Je ne sais pas exactement ce que vous voulez que les réponses gèrent, mais c'est un peu déroutant en ce moment.
Wheat Wizard
2
Je pense que vous pourriez avoir une incompréhension fondamentale du fonctionnement des flotteurs. Parce qu'ils sont de taille fixe, à mesure que les valeurs augmentent, la précision diminue. Il existe un point au-delà duquel un flottant ne peut pas représenter avec précision toutes les valeurs à 3 décimales près. De plus, la modification d'un défi pour supprimer une restriction inutile n'est pas déconseillée.
Mego

Réponses:

18

Gelée , 5 octets

IA<S}

Prend deux nombres complexes (centres) comme premier argument et deux nombres réels (rayons) comme deuxième argument.

Essayez-le en ligne!

Comment ça marche

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.
Dennis
la source
Merde, j'ai oublié d'utiliser des nombres complexes pour les coordonnées. Bon! : D
HyperNeutrino
Par intérêt, le résultat Aserait-il considéré comme la norme du vecteur ligne "centres"? ( ÆḊlui - même des erreurs avec un contenu complexe.)
Jonathan Allan
1
@JonathanAllan Oui, Acalcule les distances des centres comme la norme de leur vecteur de différence.
Dennis
11

JavaScript (ES6), 38 octets

Prend l'entrée comme 6 variables distinctes x1 , y1 , r1 , x2 , y2 , r2 .

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

Cas de test

Arnauld
la source
Pour tous ceux qui n'ont pas semblé Math.hypot auparavant.
Pureferret
@ V.Courtois La façon dont vous passez les paramètres ne correspond pas à la déclaration de méthode. Ça devrait l'être a:Double,x:Double,b:Double,y:Double,r:Double,q:Double.
Arnauld
1
@Arnauld ooh ~ merci! Dois-je le poster séparément?
V. Courtois
@ V.Courtois Bien sûr. Fonce!
Arnauld
7

Pyth, 5 octets

gsE.a

Format d'entrée:

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

Essayez-le en ligne

Comment ça marche

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

MATL , 5 octets

ZPis<

Le format d'entrée est:

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

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Comment ça marche

ZP   % Take two vectors as input. Push their Euclidean distance
i    % Input the vector of radii
s    % Sum of vector
<    % Less than?
Luis Mendo
la source
Je ne sais pas si c'est moi, mais lorsque j'utilise votre lien d'essai et que j'exécute, j'obtiens 'Erreur La réponse du serveur n'a pas pu être décodée' - Aussi Je ne sais pas si cela aide, mais avez-vous pensé à (ab) utiliser des nombres complexes comme dans la réponse Jelly?
Dennis Jaheruddin
@DennisJaheruddin Hé, ravi de vous revoir ici! (1) Mise en cache du blâme, probablement. Avez-vous essayé un rafraîchissement dur? (2) Je l'ai fait, mais je pense que c'est aussi des 5octets ( -|au lieu de ZP)
Luis Mendo
Je suppose que c'est le pare-feu. Maintenant, je me demande si un format d'entrée avec quelque chose comme -r2au lieu de r2serait utile, car alors vous auriez besoin de trois différences, au lieu de 2 différences et d'un ajout ... Je ferais mieux de courir avant de m'imprégner trop profondément!
Dennis Jaheruddin
Je ne pense pas que la négation d'une entrée soit acceptable comme format d'entrée. Si vous rencontrez des problèmes avec le service Try It Online, veuillez nous le signaler ici ?
Luis Mendo
6

R , 39 octets

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

prend l'entrée k=c(x1,x2,y1,y2)et r=c(r1,r2); renvoie FALSEpour les cercles tangents.

Essayez-le en ligne!

27 octets:

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

Prend l'entrée sous forme de matrice avec les centres du cercle donnés en lignes et un vecteur de rayons.

Essayez-le en ligne!

Giuseppe
la source
-2 octetsfunction(k,r)dist(matrix(k,2))<sum(r)
djhurio
Et alors dist(matrix(scan(),2))<sum(scan())?
djhurio
6

Python , 40 octets

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

Essayez-le en ligne!

Utilise l'arithmétique complexe de Python pour calculer la distance entre les deux centres. Je suppose que nous ne pouvons pas prendre les points d'entrée directement comme des nombres complexes, donc le code les exprime comme x+y*1j.

xnor
la source
5

05AB1E , 6 octets

αs--0›

Essayez-le en ligne!

-1 octet en utilisant a - b > 0plutôt que(reverse) b - a < 0

HyperNeutrino
la source
Oh 05AB1E fait imaginaire maintenant?
Urne de poulpe magique
1
@MagicOctopusUrn Apparemment / haussement d'épaules
HyperNeutrino
5

Python 3 , 45 octets

lambda a,b,c,d,e,f:(a-d)**2+(b-e)**2<(c+f)**2

Essayez-le en ligne!

-8 octets grâce à Neil / Step Hen

HyperNeutrino
la source
Ce code fonctionne également en python 2.
micsthepick
@micsthepick Cool, merci. C'est juste la façon dont TIO fait le formatage.
HyperNeutrino
4

APL (Dyalog) , 10 octets

Demande les centres du cercle comme liste de deux nombres complexes, puis les rayons comme liste de deux nombres

(+/⎕)>|-/

Essayez-le en ligne!

(+/⎕) [est] la somme des rayons

> plus grand que

| l'ampleur de

-/⎕ la différence dans les centres

Adam
la source
3

Mathematica, 16 octets

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

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


Mathematica a une fonction RegionIntersectionintégrée, mais cela à elle seule fait 18 octets ...

Version intégrée:

RegionIntersection@##==EmptyRegion@2&

Prend 2 Diskobjets. [Disk[{x1, y1}, r1], Disk[{x2, y2}, r2]].

JungHwan Min
la source
3

Haskell , 37 36 octets

(u#v)r x y s=(u-x)^2+(v-y)^2<(r+s)^2

Essayez-le en ligne!

Merci @AndersKaseorg pour l' -1octet!

ბიმო
la source
3
Shorter comme opérateur: (u!v)r x y s.
Anders Kaseorg
3

Gelée , 12 octets

I²+⁴I²¤<⁵S²¤

Essayez-le en ligne!

-2 octets grâce à Dennis

HyperNeutrino
la source
La création d'un nouveau lien avec ạ/²les mêmes octets ne serait-elle pas possible ?
caird coinheringaahing
@cairdcoinheringaahing?
HyperNeutrino
Peu importe, j'ai obtenu 14 octets en faisant cela
caird coinheringaahing
Vous pouvez utiliser Iau lieu de réduire par différence absolue.
Dennis
@Dennis Ooh thanks
HyperNeutrino
3

Java 8, 41 38 octets

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

Essayez-le ici.

Apparemment, Java a également Math.hypot, ce qui est 3 octets plus court.

EDIT: Je viens de réaliser que cette réponse est maintenant exactement la même que @ OlivierGrégoire réponse Java , alors s'il vous plaît, votez pour lui à la place de moi si vous aimez la réponse de 38 octets.

Ancienne réponse (41 octets) :

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

Essayez-le ici.

Kevin Cruijssen
la source
1
Oh! C'est pourquoi j'ai reçu 3 votes positifs aujourd'hui, mais 0 lorsque le défi a été signalé? ^^ Je me demandais ce qui a déclenché ce comportement bizarre;) Puisque j'aime ma réponse, et que vous avez posté la même chose, vous obtenez également un +1! : p
Olivier Grégoire
2

Pyth , 15 octets

<sm^-EE2 2^+EE2

Prend les entrées dans l'ordre x1, x2, y1, y2, r1, r2

Suite de tests!

KarlKastor
la source
2

Perl 6 , 13 octets

*+*>(*-*).abs

Essayez-le en ligne!

Les deux premiers arguments sont les rayons, dans l'un ou l'autre ordre. Les troisième et quatrième arguments sont les coordonnées des centres, sous forme de nombres complexes, dans l'un ou l'autre ordre.

Sean
la source
2

Taxi , 1582 octets

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.

Essayez-le en ligne!

Sorties 1pour les cercles qui se chevauchent.
Sorties 0pour les cercles non superposés (y compris les cercles tangentiels).

Non golfé / formaté:

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.
Ingénieur Toast
la source
2

C #, 50 41 octets

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

9 octets enregistrés grâce à @KevinCruijssen.

TheLethalCoder
la source
Ne pouvez-vous pas y sauvegarder quelques octets en écrivant à la (r+R)*2place de (r+R)+(r+R)?
Ian H.
@IanH. Ouais, je ne sais pas comment j'ai raté ça.
TheLethalCoder
Suis-je en train de manquer quelque chose ou cela ne fonctionne- t- il pas ?
Ian H.
@IanH. J'avais fait une faute de frappe, +le RHS aurait dû être un *.
TheLethalCoder
Et mes commentaires ont même aggravé la situation. Bon travail sur la solution!
Ian H.
1

PostgreSQL, 41 caractères

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

Instruction préparée, prend l'entrée comme 2 paramètres dans n'importe quelle circlenotation .

Exemple d'exécution:

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
homme au travail
la source
1

Java, 50 38 octets

(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R
Roman Gräf
la source
En utilisant des idées dans d' autres réponses, cela peut être raccourci à 38 comme ceci: (x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R. En fait, je viens de réaliser que c'est exactement la même chose que la réponse JavaScript d'Arnauld.
laszlok
Merci ... Cette réponse était destinée à être jouée ... je pensais que c'était un défi si simple qu'il n'y aurait rien qui puisse être joué ...
Roman Gräf
J'ai bien peur que votre réponse soit maintenant exactement la même que celle déjà publiée par @ OlivierGrégoire ..
Kevin Cruijssen
1

Code machine x86 (avec SSE2), 36 octets

; 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

La fonction ci-dessus accepte les descriptions de deux cercles (coordonnées x et y du point central et un rayon) et renvoie une valeur booléenne indiquant si elles se croisent ou non.

Il utilise une convention d'appel vectoriel, où les paramètres sont passés dans les registres SIMD. Sous Windows x86-32 et 64 bits, il s'agit de la __vectorcallconvention d'appel . Sur Unix / Linux / Gnu 64 bits, il s'agit de la convention d'appel AMD64 System V standard .

La valeur de retour est laissée dans l'octet bas de EAX, comme c'est le cas avec toutes les conventions d'appel x86.

Ce code fonctionne aussi bien sur les processeurs x86 32 bits et 64 bits, tant qu'ils prennent en charge le jeu d'instructions SSE2 (qui serait Intel Pentium 4 et versions ultérieures, ou AMD Athlon 64 et versions ultérieures).

Version AVX, toujours 36 octets

Si vous visiez AVX , vous souhaiterez probablement ajouter un préfixe VEX aux instructions. Cela ne change pas le nombre d'octets; juste les octets réels utilisés pour coder les instructions:

; 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

Les instructions AVX ont l'avantage de prendre trois opérandes, vous permettant d'effectuer des opérations non destructives, mais cela ne nous aide pas vraiment à compacter le code ici. Cependant, le mélange d'instructions avec et sans préfixes VEX peut entraîner un code sous-optimal, vous devez donc généralement respecter toutes les instructions AVX si vous ciblez AVX, et dans ce cas, cela ne nuit même pas à votre nombre d'octets.

Cody Grey
la source
1

PHP , 66 octets

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

Essayez-le en ligne!

S'exécute à partir de la ligne de commande, en prenant l'entrée comme 6 arguments de paramètre de ligne de commande et affiche 1 si les cercles se chevauchent, sinon 0.

WebSmithery
la source
0

Julia 0.6.0 (46 octets)

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

Clojure, 68 octets

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

Prend six arguments: x1, y1, r1, x2, y2, r2. Renvoie vrai ou faux.

Malheureusement, Clojure n'a aucune powfonction. Coûte beaucoup d'octets.

Joshua
la source
0

En fait , 8 octets

-)-(h@+>

Essayez-le en ligne!

Explication:

-)-(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?
Mego
la source
0

R (+ pryr), 31 octets

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

Qui évalue à la fonction

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

xsont les coordonnées du cercle 1, ysont les coordonnées du cercle 2 et zles rayons.

Calcule la distance entre les deux centres à l'aide de Pythagore et teste si cette distance est inférieure à la somme des rayons.

Utilise la vectorisation de R pour calculer (x1-x2)^2et (y1-y2)^2. Ceux-ci sont ensuite additionnés et carrément enracinés.

JAD
la source
0

Aller , 93 octets

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

Algorithme assez simple, identique à plusieurs autres réponses, sauf qu'il utilise le type intégré complexet appelle math / cmplx.Abs ().

Prendre les rayons comme des nombres complexes n'aide pas, car le transtypage en float64 ajoute plus d'octets que la déclaration de variable n'en économise (impossible float64 < complex128).

Essayez-le en ligne! Inclut les cas de test et utilise le package main au lieu d'une bibliothèque.

Riking
la source