¿Se superponen los círculos?

21

Dadas las coordenadas de los centros y los radios de 2 círculos, genera un valor verdadero de si se superponen o no.

Entrada

  • La entrada se puede tomar a través de STDIN o equivalente, argumentos de función, pero no como una variable. Puede tomarlos como una sola variable (lista, cadena, etc.) o como múltiples entradas / argumentos, en el orden que desee.

  • La entrada será de seis flotadores. Estas carrozas serán de hasta 3 decimales. Las coordenadas pueden ser positivas o negativas. Los radios serán positivos.

Salida

  • La salida puede ser a través de STDOUT o retorno de función.

  • El programa debe tener exactamente 2 salidas distintas: una para un valor Verdadero (los círculos se superponen) y otra para una salida Falsa (no se superponen).

Casos de prueba

(La entrada se proporciona como una lista de tuplas [(x1, y1, r1), (x2, y2, r2)]para los casos de prueba; puede tomar la entrada en cualquier formato)

Cierto

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

Falso

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

Este es Code Golf, la respuesta más corta en bytes gana.

Tim
fuente
44
¿Qué debemos devolver si dos círculos se tocan externamente?
JungHwan Min
66
El término técnico para "tocar pero no superponerse" es "tangente" y es algo en geometría, si no en ningún otro lado.
dmckee
2
Tomar flotadores parece un requisito bastante estricto. ¿Podrías relajarlo a una representación más general? Me gustaría resolver esto en Brain-Flak, pero es poco probable que me tome el tiempo para implementar flotadores IEEE, y si lo hiciera, sería el 90% del recuento de bytes de todos modos, así que solo estaría jugando al golf en una implementación de flotador.
Wheat Wizard
44
También me gustaría señalar que los flotadores no son precisos hasta "tres decimales" en muchos casos. No estoy seguro exactamente de qué quiere que respondan las respuestas, pero es un poco confuso en este momento.
Wheat Wizard
2
Creo que podrías tener un malentendido fundamental sobre cómo funcionan los flotadores. Debido a que son de tamaño fijo, a medida que los valores aumentan, la precisión disminuye. Hay un punto más allá del cual un flotador no puede representar con precisión todos los valores dentro de 3 decimales. Además, no se desaconseja editar un desafío para eliminar una restricción innecesaria.
Mego

Respuestas:

18

Jalea , 5 bytes

IA<S}

Toma dos números complejos (centros) como primer argumento y dos números reales (radios) como segundo argumento.

Pruébalo en línea!

Cómo funciona

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
fuente
Maldición, olvidé usar números complejos para las coordenadas. Bueno uno! : D
HyperNeutrino
Fuera de interés, ¿se consideraría el resultado de Aaquí la norma de los "centros" del vector fila? ( ÆḊerrores en sí mismos con contenido complejo.)
Jonathan Allan
1
@JonathanAllan Sí, Acalcula las distancias de los centros como la norma de su vector de diferencia.
Dennis
11

JavaScript (ES6), 38 bytes

Toma la entrada como 6 variables distintas x1 , y1 , r1 , x2 , y2 , r2 .

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

Casos de prueba

Arnauld
fuente
Para cualquiera que no haya parecido Math.hypot antes.
Pureferret
scala polyglot :) pero no funciona por alguna razón
V. Courtois
@ V.Courtois La forma en que pasa los parámetros no coincide con la declaración del método. Debería ser a:Double,x:Double,b:Double,y:Double,r:Double,q:Double.
Arnauld
1
@Arnauld ooh ~ gracias! ¿Debo publicarlo por separado?
V. Courtois
@ V.Courtois seguro. ¡Ve a por ello!
Arnauld
7

Pyth, 5 bytes

gsE.a

Formato de entrada:

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

Pruébalo en línea

Cómo funciona

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

MATL , 5 bytes

ZPis<

El formato de entrada es:

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

Pruébalo en línea! O verificar todos los casos de prueba .

Cómo funciona

ZP   % Take two vectors as input. Push their Euclidean distance
i    % Input the vector of radii
s    % Sum of vector
<    % Less than?
Luis Mendo
fuente
No estoy seguro de si soy yo, pero cuando uso su enlace de prueba y presiono ejecutar aparece 'Error La respuesta del servidor no pudo ser decodificada' - Tampoco estoy seguro si ayuda, pero ¿pensó en (ab) usar números complejos como en la respuesta de gelatina?
Dennis Jaheruddin
@DennisJaheruddin ¡Hola, me alegro de verte de nuevo aquí! (1) culpa de almacenamiento en caché, probablemente. ¿Intentaste una actualización dura? (2) Lo hice, pero creo que también son 5bytes (en -|lugar de ZP)
Luis Mendo
Supongo que es el firewall. Ahora me pregunto si un formato de entrada con algo así en -r2lugar de r2ayudaría porque entonces necesitaría tres diferencias, en lugar de 2 diferencias y una adición ... ¡Será mejor que corra antes de que me hunda demasiado!
Dennis Jaheruddin
No creo que negar una entrada sea aceptable como formato de entrada. Si encuentra algún problema con el servicio Try It Online, ¿podría informar aquí ?
Luis Mendo
6

R , 39 bytes

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

toma entrada k=c(x1,x2,y1,y2)y r=c(r1,r2); vuelve FALSEpara círculos tangentes.

Pruébalo en línea!

27 bytes:

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

Toma la entrada como una matriz con los centros del círculo dados como filas y un vector de radios.

Pruébalo en línea!

Giuseppe
fuente
-2 bytesfunction(k,r)dist(matrix(k,2))<sum(r)
djhurio
¿Qué hay de 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

Pruébalo en línea!

Utiliza la aritmética compleja de Python para calcular la distancia entre los dos centros. Supongo que no podemos tomar los puntos de entrada directamente como números complejos, por lo que el código los expresa como x+y*1j.

xnor
fuente
5

05AB1E , 6 bytes

αs--0›

Pruébalo en línea!

-1 byte usando en a - b > 0lugar de(reverse) b - a < 0

Hiperneutrino
fuente
Oh 05AB1E hace imaginario ahora?
Urna mágica del pulpo
1
@MagicOctopusUrn Aparentemente / encogiéndose de hombros
HyperNeutrino
5

Python 3 , 45 bytes

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

Pruébalo en línea!

-8 bytes gracias a Neil / Step Hen

Hiperneutrino
fuente
Este código también funciona en python 2.
micsthepick
@micsthepick Genial, gracias. Es solo la forma en que TIO formatea.
HyperNeutrino
4

APL (Dyalog) , 10 bytes

Solicita centros de círculo como lista de dos números complejos, luego radios como lista de dos números

(+/⎕)>|-/

Pruébalo en línea!

(+/⎕) [es] la suma de los radios

> mas grande que

| la magnitud de

-/⎕ la diferencia en centros

Adán
fuente
3

Mathematica, 16 bytes

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

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


Mathematica tiene una función RegionIntersectionincorporada, pero solo tiene 18 bytes de longitud ...

Versión incorporada:

RegionIntersection@##==EmptyRegion@2&

Toma 2 Diskobjetos. [Disk[{x1, y1}, r1], Disk[{x2, y2}, r2]].

JungHwan Min
fuente
3

Haskell , 37 36 bytes

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

Pruébalo en línea!

¡Gracias @AndersKaseorg por el -1byte!

ბიმო
fuente
3
Más corto que un operador: (u!v)r x y s.
Anders Kaseorg
3

Jalea , 12 bytes

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

Pruébalo en línea!

-2 bytes gracias a Dennis

Hiperneutrino
fuente
¿No crearía un nuevo enlace con los ạ/²mismos bytes?
caird coinheringaahing
@cairdcoinheringaahing?
HyperNeutrino
No importa, obtuve 14 bytes al hacer esto
caird coinheringaahing
Puede usar en Ilugar de reducir por diferencia absoluta.
Dennis
@ Dennis Ooh gracias
HyperNeutrino
3

Java 8, 41 38 bytes

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

Pruébalo aquí

Aparentemente, Java también tiene Math.hypot, que es 3 bytes más corto.

EDITAR: Acabo de darme cuenta de que esta respuesta ahora es exactamente la misma que la respuesta de Java 8 de @ OlivierGrégoire , así que por favor, vota a él en lugar de a mí si te gusta la respuesta de 38 bytes.

Respuesta anterior (41 bytes) :

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

Pruébalo aquí

Kevin Cruijssen
fuente
1
Oh! Entonces, ¿por eso recibí 3 votos a favor hoy, pero 0 cuando se publicó el desafío? ^^ Me preguntaba qué desencadenó este comportamiento extraño;) Como me gusta mi respuesta y publicaste lo mismo, ¡también obtienes un +1! : p
Olivier Grégoire
2

Perl 6 , 13 bytes

*+*>(*-*).abs

Pruébalo en línea!

Los dos primeros argumentos son los radios, en cualquier orden. Los argumentos tercero y cuarto son las coordenadas de los centros, como números complejos, en cualquier orden.

Sean
fuente
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.

Pruébalo en línea!

Salidas 1para círculos superpuestos.
Salidas 0para círculos no superpuestos (incluidos círculos tangenciales).

Sin golf / formateado:

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.
Tostadas de ingeniero
fuente
2

C #, 50 41 bytes

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

Guardado 9 bytes gracias a @KevinCruijssen.

TheLethalCoder
fuente
¿No puedes guardar algunos bytes allí escribiendo en (r+R)*2lugar de (r+R)+(r+R)?
Ian H.
@IanH. Sí, no sé cómo me perdí eso.
TheLethalCoder
¿Me estoy perdiendo algo o esto no funciona ?
Ian H.
@IanH. Hice un error tipográfico, el +en el RHS debería haber sido un *.
TheLethalCoder
Y mis comentarios incluso lo empeoraron. ¡Buen trabajo en la solución!
Ian H.
1

PostgreSQL, 41 caracteres

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

Declaración preparada, toma la entrada como 2 parámetros en cualquier circlenotación .

Ejecución de muestra:

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
hombre trabajando
fuente
1

Java, 50 38 bytes

(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R
Roman Gräf
fuente
El uso de las ideas en otras respuestas, esto se puede acortar a 38, así: (x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R. De hecho, me acabo de dar cuenta de que esto es exactamente lo mismo que la respuesta de JavaScript de Arnauld.
laszlok
Gracias ... Esta respuesta nunca tuvo la intención de jugar al golf ... pensé que era un desafío tan simple que no habría nada que se pueda jugar al golf ...
Roman Gräf
Me temo que su respuesta ahora es exactamente la misma que la respuesta ya publicada por @ OlivierGrégoire ..
Kevin Cruijssen
1

Código de máquina x86 (con SSE2), 36 bytes

; 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 función anterior acepta descripciones de dos círculos (coordenadas x e y del punto central y un radio) y devuelve un valor booleano que indica si se cruzan o no.

Utiliza una convención de llamada vectorial, donde los parámetros se pasan en registros SIMD. En x86-32 y Windows de 64 bits, esta es la __vectorcallconvención de llamada . En Unix / Linux / Gnu de 64 bits, esta es la convención de llamadas estándar de System V AMD64 .

El valor de retorno se deja en el byte bajo de EAX, como es estándar con todas las convenciones de llamadas x86.

Este código funciona igualmente bien en procesadores x86 de 32 bits y 64 bits, siempre que sean compatibles con el conjunto de instrucciones SSE2 (que sería Intel Pentium 4 y posterior, o AMD Athlon 64 y posterior).

Versión AVX, todavía 36 bytes

Si estaba apuntando a AVX , probablemente desee agregar un prefijo VEX a las instrucciones. Esto no cambia el recuento de bytes; solo los bytes reales utilizados para codificar las instrucciones:

; 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

Las instrucciones AVX tienen la ventaja de tomar tres operandos, lo que le permite realizar operaciones no destructivas, pero eso realmente no nos ayuda a compactar el código aquí. Sin embargo, mezclar instrucciones con y sin prefijos VEX puede resultar en un código subóptimo, por lo que generalmente desea seguir todas las instrucciones AVX si está apuntando a AVX, y en este caso, ni siquiera daña su conteo de bytes.

Cody Gray
fuente
1

PHP , 66 bytes

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

Pruébalo en línea!

Se ejecuta desde la línea de comando, tomando la entrada como 6 argumentos de parámetros de línea de comando, e imprime 1 si los círculos se superponen, de lo contrario 0.

WebSmithery
fuente
0

Julia 0.6.0 (46 bytes)

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

Clojure, 68 bytes

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

Toma seis argumentos: x1, y1, r1, x2, y2, r2. Devuelve verdadero o falso.

Lamentablemente, Clojure no tiene una powfunción de algún tipo. Cuesta muchos bytes.

Joshua
fuente
0

En realidad , 8 bytes

-)-(h@+>

Pruébalo en línea!

Explicación:

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

R (+ pryr), 31 bytes

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

Que evalúa la función

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

Donde xestán las coordenadas del círculo 1, yson las coordenadas del círculo 2 y zlos radios.

Calcula la distancia entre los dos centros usando Pitágoras y comprueba si esa distancia es menor que la suma de los radios.

Utiliza la vectorización de R para calcular simultáneamente (x1-x2)^2y (y1-y2)^2. Estos se suman y se enraizan.

JAD
fuente
0

Go , 93 bytes

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

Algoritmo bastante simple, igual que varias otras respuestas, excepto que usa el tipo incorporado complexy llama a math / cmplx.Abs ().

Tomar los radios como números complejos no ayuda, porque la conversión a float64 agrega más bytes de los que la declaración de variables guarda (no puede hacer float64 < complex128).

Pruébalo en línea! Incluye los casos de prueba y utiliza el paquete principal en lugar de una biblioteca.

Riking
fuente