Überlappen sich die Kreise?


21

Ausgehend von den Koordinaten der Zentren und den Radien von 2 Kreisen wird ein wahrer Wert ausgegeben, der angibt, ob sie sich überlappen oder nicht.

Eingang

  • Die Eingabe kann über STDIN oder äquivalente Funktionsargumente erfolgen, jedoch nicht als Variable. Sie können sie als einzelne Variable (Liste, Zeichenfolge usw.) oder als mehrere Eingaben / Argumente in beliebiger Reihenfolge verwenden.

  • Der Eingang wird sechs Floats sein. Diese Gleitkommazahlen haben bis zu 3 Dezimalstellen. Die Koordinaten können positiv oder negativ sein. Die Radien sind positiv.

Ausgabe

  • Die Ausgabe kann über STDOUT oder Funktionsrückgabe erfolgen.

  • Das Programm muss genau 2 verschiedene Ausgaben haben - eine für einen True-Wert (die Kreise überlappen sich) und eine für eine False-Ausgabe (sie überlappen sich nicht).

Testfälle

(Die Eingabe erfolgt als Tupelliste [(x1, y1, r1), (x2, y2, r2)]für die Testfälle; Sie können Eingaben in jedem Format vornehmen.)

Wahr

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

Falsch

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

Dies ist Code Golf, die kürzeste Antwort in Bytes gewinnt.


4
Was müssen wir zurückgeben, wenn sich zwei Kreise von außen berühren?
JungHwan Min

6
Der Fachbegriff für "berühren, aber nicht überlappen" ist "tangential" und es ist eine Sache in der Geometrie, wenn nirgendwo anders.
DMCKEE

2
Das Nehmen von Schwimmern scheint eine ziemlich strenge Anforderung zu sein. Könnten Sie es zu einer allgemeineren Darstellung entspannen? Ich würde das gerne in Brain-Flak lösen, aber es ist unwahrscheinlich, dass ich mir die Zeit nehme, um IEEE-Floats zu implementieren, und wenn ich das täte, wären es sowieso 90% der Byteanzahl, also würde ich nur eine Float-Implementierung spielen.
Weizen-Assistent

4
Ich möchte auch darauf hinweisen, dass Floats in vielen Fällen nicht bis auf "drei Dezimalstellen" genau sind. Ich bin mir nicht sicher, wie genau Sie mit den Antworten umgehen sollen, aber es ist im Moment etwas verwirrend.
Weizen-Assistent

2
Ich denke, Sie könnten ein grundlegendes Missverständnis darüber haben, wie Schwimmkörper funktionieren. Da sie eine feste Größe haben, sinkt die Genauigkeit, wenn die Werte größer werden. Es gibt einen Punkt, ab dem ein Gleitkomma nicht alle Werte innerhalb von 3 Dezimalstellen genau darstellen kann. Auch das Bearbeiten einer Herausforderung zum Entfernen einer unnötigen Einschränkung wird nicht entmutigt.
Mego

Antworten:


18

Gelee , 5 Bytes

IA<S}

Nimmt zwei komplexe Zahlen (Zentren) als erstes Argument und zwei reelle Zahlen (Radien) als zweites Argument.

Probieren Sie es online!

Wie es funktioniert

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.

Verdammt, ich habe vergessen, komplexe Zahlen für Koordinaten zu verwenden. Guter! : D
HyperNeutrino

Würde das Ergebnis von Ahier aus Interesse als die Norm des Zeilenvektors "Zentren" angesehen? ( ÆḊselbst Fehler mit komplexen Inhalten.)
Jonathan Allan

1
@ JonathanAllan Ja, Aberechnet die Abstände der Zentren als Norm für ihren Differenzvektor.
Dennis

11

JavaScript (ES6), 38 Byte

Nimmt die Eingabe als 6 verschiedene Variablen x1 , y1 , r1 , x2 , y2 , r2 .

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

Testfälle


Für alle, die noch nie Math.hypot gesehen haben.
Pureferret


@ V.Courtois Die Art und Weise, wie Sie die Parameter übergeben, stimmt nicht mit der Methodendeklaration überein. Es sollte so sein a:Double,x:Double,b:Double,y:Double,r:Double,q:Double.
Arnauld

1
@ Arnauld ooh ~ danke! Soll ich es separat posten?
V. Courtois

@ V.Courtois sicher. Tue es!
Arnauld

7

Pyth, 5 Bytes

gsE.a

Eingabeformat:

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

Probieren Sie es online aus

Wie es funktioniert

     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 Bytes

ZPis<

Eingabeformat ist:

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

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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

Ich bin mir nicht sicher, ob ich es bin, aber wenn ich Ihren Testlink verwende und auf "Ausführen" drücke, erhalte ich die Meldung "Fehler Die Antwort des Servers konnte nicht decodiert werden". Ich bin mir auch nicht sicher, ob dies hilfreich ist, aber haben Sie darüber nachgedacht, komplexe Zahlen wie (ab) zu verwenden in der Gelee-Antwort?
Dennis Jaheruddin

@DennisJaheruddin Hey, schön dich wieder hier zu sehen! (1) Vermutlich Caching der Schuld. Haben Sie versucht, eine Aktualisierung durchzuführen? (2) Ich habe, aber ich denke, es ist auch 5Bytes ( -|anstelle von ZP)
Luis Mendo

Ich nehme an, es ist die Firewall. Jetzt frage ich mich, ob ein Eingabeformat mit so etwas wie " -r2anstatt" r2helfen würde, weil dann drei Unterschiede anstelle von zwei Unterschieden und einer Ergänzung benötigt würden ... Ich sollte besser laufen, bevor ich zu tief hineingezogen werde!
Dennis Jaheruddin

Ich denke nicht, dass das Negieren einer Eingabe als Eingabeformat akzeptabel ist. Wenn Sie Probleme mit dem Try It Online-Dienst haben, können Sie dies hier melden .
Luis Mendo

6

R , 39 Bytes

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

nimmt Eingabe k=c(x1,x2,y1,y2)und r=c(r1,r2); Gibt FALSEfür tangentiale Kreise zurück.

Probieren Sie es online!

27 Bytes:

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

Nimmt die Eingabe als Matrix mit den als Zeilen angegebenen Kreismitten und einem Radienvektor.

Probieren Sie es online!


-2 Bytesfunction(k,r)dist(matrix(k,2))<sum(r)
Djhurio

Was ist dist(matrix(scan(),2))<sum(scan())?
Djhurio

6

Python , 40 Bytes

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

Probieren Sie es online!

Verwendet Pythons komplexe Arithmetik, um den Abstand zwischen den beiden Zentren zu berechnen. Ich gehe davon aus, dass wir die Eingabepunkte nicht direkt als komplexe Zahlen interpretieren können x+y*1j. Der Code drückt sie also so aus .





4

APL (Dyalog) , 10 Bytes

Fordert zur Eingabe von Kreismittelpunkten als Liste mit zwei komplexen Zahlen auf, dann zur Eingabe von Radien als Liste mit zwei Zahlen

(+/⎕)>|-/

Probieren Sie es online!

(+/⎕) [ist] die Summe der Radien

> größer als

| die Größe von

-/⎕ der Unterschied in den Zentren


3

Mathematica, 16 Bytes

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

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


Mathematica hat eine RegionIntersectioneingebaute, aber das allein ist 18 Bytes lang ...

Eingebaute Version:

RegionIntersection@##==EmptyRegion@2&

Nimmt 2 DiskGegenstände. [Disk[{x1, y1}, r1], Disk[{x2, y2}, r2]].





3

Java 8, 41 38 Bytes

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

Probieren Sie es hier aus.

Anscheinend hat Java auch das Math.hypot, was 3 Bytes kürzer ist.

BEARBEITEN: Ich habe gerade festgestellt, dass diese Antwort jetzt genau der Antwort von @ OlivierGrégoire in Java 8 entspricht. Bitte stimmen Sie ihm statt mir zu, wenn Sie die 38-Byte-Antwort mögen.

Alte Antwort (41 Bytes) :

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

Probieren Sie es hier aus.


1
Oh! Deshalb habe ich heute 3 Upvotes bekommen, aber 0, als die Challenge gepostet wurde? ^^ Ich habe mich gefragt, was dieses seltsame Verhalten ausgelöst hat;) Da mir meine Antwort gefällt und du das gleiche gepostet hast, bekommst du auch eine +1! : p
Olivier Grégoire


2

Perl 6 , 13 Bytes

*+*>(*-*).abs

Probieren Sie es online!

Die ersten beiden Argumente sind die Radien in beliebiger Reihenfolge. Das dritte und vierte Argument sind die Koordinaten der Zentren als komplexe Zahlen in beliebiger Reihenfolge.


2

Taxi , 1582 Bytes

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.

Probieren Sie es online!

Ausgaben 1für überlappende Kreise.
Ausgaben 0für nicht überlappende Kreise (einschließlich Tangentialkreise).

Ungolfed / formatiert:

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 Bytes

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

9 Bytes dank @KevinCruijssen gespeichert.


Können Sie dort nicht ein paar Bytes sparen, indem Sie schreiben (r+R)*2statt (r+R)+(r+R)?
Ian H.

@ IanH. Ja, ich weiß nicht, wie ich das verpasst habe.
TheLethalCoder

Vermisse ich etwas oder geht das nicht ?
Ian H.

@ IanH. Ich hatte einen Tippfehler gemacht, der +auf der rechten Seite hätte sein sollen *.
TheLethalCoder

Und mein Feedback hat das noch schlimmer gemacht. Gute Arbeit bei der Lösung!
Ian H.


1

PostgreSQL, 41 Zeichen

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

Prepared-Anweisung, nimmt die Eingabe als 2 Parameter in einer beliebigen circleNotation an .

Probelauf:

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 Bytes

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

Mit Ideen in anderen Antworten, kann dies wie so auf 38 verkürzt werden: (x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R. Tatsächlich wurde mir gerade klar, dass dies genau dasselbe ist wie Arnauld's JavaScript-Antwort.
Laszlok

Dank ... Diese Antwort wurde nevee bestimmt werden golfed ... Ich dachte , es war eine so einfache Aufgabe es wäre nicht alles sein , was kann golfed werden ...
Roman Gräf

Ich fürchte, Ihre Antwort ist jetzt genau die gleiche wie die bereits gepostete Antwort von @ OlivierGrégoire ..
Kevin Cruijssen

1

x86-Maschinencode (mit 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

Die obige Funktion akzeptiert Beschreibungen von zwei Kreisen (x- und y-Koordinaten des Mittelpunkts und eines Radius) und gibt einen Booleschen Wert zurück, der angibt, ob sie sich schneiden oder nicht.

Es wird eine Vektoraufrufkonvention verwendet, bei der die Parameter in SIMD-Registern übergeben werden. Bei x86-32- und 64-Bit-Windows ist dies die __vectorcallAufrufkonvention . Auf 64-Bit - Unix / Linux / Gnu, ist dies der Standard System V AMD64 - Aufrufkonvention .

Der Rückgabewert bleibt im Low-Byte von EAX, wie es bei allen x86-Aufrufkonventionen üblich ist.

Dieser Code funktioniert auf 32-Bit- und 64-Bit-x86-Prozessoren gleichermaßen gut, sofern sie den SSE2-Befehlssatz (Intel Pentium 4 und höher oder AMD Athlon 64 und höher) unterstützen.

AVX-Version, noch 36 Bytes

Wenn Sie auf AVX abzielen , möchten Sie den Anweisungen wahrscheinlich ein VEX-Präfix hinzufügen. Die Anzahl der Bytes wird dadurch nicht geändert. Nur die tatsächlichen Bytes, die zum Codieren der Anweisungen verwendet werden:

; 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-Anweisungen haben den Vorteil, drei Operanden zu verwenden, sodass Sie zerstörungsfreie Operationen ausführen können. Dies hilft uns jedoch nicht wirklich, den Code hier zu komprimieren. Das Mischen von Anweisungen mit und ohne VEX-Präfixen kann jedoch zu suboptimalem Code führen. Wenn Sie also auf AVX abzielen, möchten Sie im Allgemeinen alle AVX-Anweisungen einhalten.



1

PHP , 66 Bytes

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

Probieren Sie es online!

Wird über die Befehlszeile ausgeführt, wobei die Eingabe als 6 Befehlszeilenparameterargumente verwendet wird, und gibt 1 aus, wenn sich die Kreise überlappen, andernfalls 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 Bytes

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

Nimmt sechs Argumente an: x1, y1, r1, x2, y2, r2. Gibt true oder false zurück.

Leider hat Clojure keine bestimmte powFunktion. Kostet eine Menge Bytes.


0

Eigentlich 8 Bytes

-)-(h@+>

Probieren Sie es online!

Erläuterung:

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

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

Welches zur Funktion auswertet

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

Wo xsind die Koordinaten von Kreis 1, ysind die Koordinaten von Kreis 2 undz die Radien.

Berechnet den Abstand zwischen den beiden Zentren mit Pythagoras und testet, ob dieser Abstand kleiner ist als die Summe der Radien.

Nutzt die Vektorisierung von R, um gleichzeitig (x1-x2)^2und zu berechnen (y1-y2)^2. Diese werden dann summiert und genau verwurzelt.


0

Los , 93 Bytes

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

Ziemlich einfacher Algorithmus, der mit mehreren anderen Antworten identisch ist, außer dass er den integrierten complexTyp verwendet und math / cmplx.Abs () aufruft.

Es hilft nicht, die Radien als komplexe Zahlen zu betrachten, da die Umwandlung in float64 mehr Bytes hinzufügt, als die Variablendeklaration speichert (was nicht möglich ist float64 < complex128).

Probieren Sie es online! Schließt die Testfälle ein und verwendet package main anstelle einer Bibliothek.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.