I cerchi si sovrappongono?


21

Date le coordinate dei centri e i raggi di 2 cerchi, emettono un valore veritiero se si sovrappongono o meno.

Ingresso

  • L'input può essere preso tramite STDIN o argomenti funzione equivalenti, ma non come una variabile. Puoi prenderli come una singola variabile (elenco, stringa, ecc.) O come più input / argomenti, nell'ordine che desideri.

  • L'input sarà di sei float. Questi float avranno un massimo di 3 decimali. Le coordinate possono essere positive o negative. I raggi saranno positivi.

Produzione

  • L'uscita può avvenire tramite STDOUT o ritorno di funzione.

  • Il programma deve avere esattamente 2 output distinti: uno per un valore True (i cerchi si sovrappongono) e uno per un output False (non si sovrappongono).

Casi test

(L'input viene fornito come elenco di tuple [(x1, y1, r1), (x2, y2, r2)]per i casi di test; è possibile accettare input in qualsiasi formato)

Vero

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

Questo è Code Golf, la risposta più breve in byte vince.


4
Cosa dobbiamo restituire se due cerchi si toccano esternamente?
JungHwan Min,

6
Il termine tecnico per "toccare ma non sovrapporre" è "tangente" ed è una cosa in geometria se non altro.
Dmckee,

2
Prendere galleggianti sembra un requisito piuttosto rigoroso. Potresti rilassarlo in una rappresentazione più generale? Vorrei risolverlo in Brain-Flak, ma è improbabile che mi prenda il tempo per implementare i float IEEE, e se lo facessi sarebbe comunque il 90% del conteggio dei byte, quindi giocherei a golf un'implementazione float.
Wheat Wizard

4
Vorrei anche sottolineare che i float non sono precisi fino a "tre cifre decimali" in molti casi. Non sono sicuro di cosa tu voglia gestire le risposte, ma al momento è un po 'confuso.
Wheat Wizard

2
Penso che potresti avere un malinteso fondamentale su come funzionano i galleggianti. Poiché sono di dimensioni fisse, man mano che i valori aumentano, la precisione diminuisce. Esiste un punto oltre il quale un float non può rappresentare accuratamente tutti i valori entro 3 cifre decimali. Inoltre, la modifica di una sfida per rimuovere una restrizione non necessaria non è scoraggiata.
Mego,

Risposte:


18

Gelatina , 5 byte

IA<S}

Accetta due numeri complessi (centri) come primo argomento e due numeri reali (raggi) come secondo argomento.

Provalo online!

Come funziona

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.

Dannazione, ho dimenticato di usare numeri complessi per le coordinate. Buona! : D
HyperNeutrino,

Per interesse, il risultato Aqui sarebbe considerato la norma dei "centri" del vettore di riga? ( ÆḊerrori di per sé con contenuti complessi).
Jonathan Allan,

1
@JonathanAllan Sì, Acalcola le distanze dei centri come norma del loro vettore di differenza.
Dennis,

11

JavaScript (ES6), 38 byte

Accetta input come 6 variabili distinte x1 , y1 , r1 , x2 , y2 , r2 .

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

Casi test


Per chiunque non sia mai sembrato Math.hypot prima d'ora.
Pureferret,


@ V.Courtois Il modo in cui si passano i parametri non corrisponde alla dichiarazione del metodo. Dovrebbe essere a:Double,x:Double,b:Double,y:Double,r:Double,q:Double.
Arnauld,

1
@Arnauld ooh ~ grazie! Devo pubblicarlo separatamente?
V. Courtois,

@ V.Courtois Certo. Fallo!
Arnauld,

7

Pyth, 5 byte

gsE.a

Formato di input:

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

Provalo online

Come funziona

     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<

Il formato di input è:

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

Provalo online! Oppure verifica tutti i casi di test .

Come funziona

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

Non sono sicuro se sono io, ma quando utilizzo il tuo link di prova e premo run ottengo "Errore La risposta del server non può essere decodificata" - Inoltre, non sono sicuro che sia d'aiuto, ma hai pensato di (ab) usare numeri complessi come nella risposta Jelly?
Dennis Jaheruddin,

@DennisJaheruddin Ehi, piacere di rivederti qui! (1) Incolpare la cache, probabilmente. Hai provato un aggiornamento intenso? (2) L'ho fatto, ma penso che sia anche 5byte ( -|anziché ZP)
Luis Mendo,

Suppongo sia il firewall. Ora mi chiedo se un formato di input con qualcosa di simile -r2invece di r2sarebbe di aiuto perché allora avresti bisogno di tre differenze, invece di 2 differenze e un'aggiunta ... Farò meglio a correre prima di essere disegnato troppo in profondità!
Dennis Jaheruddin,

Non penso che negare un input sia accettabile come formato di input. Se riscontri problemi con il servizio Try It Online, ti preghiamo di segnalare qui ?
Luis Mendo,

6

R , 39 byte

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

accetta input k=c(x1,x2,y1,y2)e r=c(r1,r2); ritorna FALSEper i cerchi tangenti.

Provalo online!

27 byte:

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

Accetta input come una matrice con i centri del cerchio indicati come righe e un vettore di raggi.

Provalo online!


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

Che dire 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

Provalo online!

Utilizza l'aritmetica complessa di Python per calcolare la distanza tra i due centri. Suppongo che non possiamo prendere direttamente i punti di input come numeri complessi, quindi il codice li esprime come x+y*1j.





4

APL (Dyalog) , 10 byte

Richiede i centri del cerchio come elenco di due numeri complessi, quindi i raggi come elenco di due numeri

(+/⎕)>|-/

Provalo online!

(+/⎕) [è] la somma dei raggi

> più grande di

| la grandezza di

-/⎕ la differenza nei centri


3

Mathematica, 16 byte

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

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


Mathematica ha un RegionIntersectionbuiltin, ma che da solo è lungo 18 byte ...

Versione integrata:

RegionIntersection@##==EmptyRegion@2&

Accetta 2 Diskoggetti. [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

Provalo qui.

Apparentemente, anche Java ha Math.hypot, che è di 3 byte in meno.

EDIT: Ho appena realizzato che questa risposta ora è esattamente la stessa della risposta Java 8 di @OlivierGrégoire , quindi per favore vota lui invece di me se ti piace la risposta a 38 byte.

Vecchia risposta (41 byte) :

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

Provalo qui.


1
Oh! Ecco perché ho ricevuto 3 voti oggi, ma 0 quando è stata pubblicata la sfida? ^^ Mi chiedevo che cosa ha scatenato questo strano comportamento;) Dal momento che mi piace la mia risposta, e hai pubblicato lo stesso, ottieni anche un +1! : p
Olivier Grégoire,


2

Perl 6 , 13 byte

*+*>(*-*).abs

Provalo online!

I primi due argomenti sono i raggi, in entrambi gli ordini. Il terzo e il quarto argomento sono le coordinate dei centri, come numeri complessi, in entrambi gli ordini.


2

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

Provalo online!

Uscite 1per cerchi sovrapposti.
Output 0per cerchi non sovrapposti (inclusi cerchi tangenziali).

Ungolf / formattato:

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

Salvataggio di 9 byte grazie a @KevinCruijssen.


Non puoi salvare qualche byte lì scrivendo (r+R)*2invece di (r+R)+(r+R)?
Ian H.

@IanH. Sì, non so come mi sia perso.
TheLethalCoder il

Mi sto perdendo qualcosa o non funziona ?
Ian H.

@IanH. Avevo fatto un refuso, +l'RHS avrebbe dovuto essere un *.
TheLethalCoder il

E il mio feedback ha anche peggiorato le cose. Ottimo lavoro sulla soluzione però!
Ian H.


1

PostgreSQL, 41 caratteri

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

Dichiarazione preparata, accetta input come 2 parametri in qualsiasi circlenotazione .

Esecuzione di esempio:

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

Utilizzando le idee in altre risposte, questo può essere ridotto a 38 in questo modo: (x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R. In realtà, ho appena realizzato che questo è esattamente lo stesso della risposta JavaScript di Arnauld.
laszlok,

Grazie ... La risposta è stata nevee destinati ad essere giocato a golf ... ho pensato che fosse una sfida così semplice, non ci sarebbe stato qualche cosa che può essere giocato a golf ...
Romano Gräf

Temo che la tua risposta sia esattamente la stessa della risposta già pubblicata da @ OlivierGrégoire ..
Kevin Cruijssen

1

Codice macchina x86 (con 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

La funzione sopra accetta le descrizioni di due cerchi (coordinate x e y del punto centrale e un raggio) e restituisce un valore booleano che indica se si intersecano o meno.

Utilizza una convenzione di chiamata vettoriale, in cui i parametri vengono passati nei registri SIMD. Su Windows x86-32 e 64 bit, questa è la __vectorcallconvenzione di chiamata . Su Unix / Linux / Gnu a 64 bit, questa è la convenzione di chiamata standard System V AMD64 .

Il valore restituito viene lasciato nel byte basso di EAX, come standard con tutte le convenzioni di chiamata x86.

Questo codice funziona ugualmente bene su processori x86 a 32 e 64 bit, purché supportino il set di istruzioni SSE2 (che sarebbe Intel Pentium 4 e versioni successive o AMD Athlon 64 e versioni successive).

Versione AVX, ancora 36 byte

Se scegli come target AVX , probabilmente vorrai aggiungere un prefisso VEX alle istruzioni. Questo non cambia il conteggio dei byte; solo i byte effettivi utilizzati per codificare le istruzioni:

; 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

Le istruzioni AVX hanno il vantaggio di prendere tre operandi, permettendoti di eseguire operazioni non distruttive, ma ciò non ci aiuta davvero a compattare il codice qui. Tuttavia, mescolando le istruzioni con e senza i prefissi VEX si può ottenere un codice non ottimale, quindi in genere si desidera attenersi a tutte le istruzioni AVX se si sta prendendo di mira AVX e, in questo caso, non danneggia nemmeno il conteggio dei byte.



1

PHP , 66 byte

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

Provalo online!

Viene eseguito dalla riga di comando, prendendo l'input come 6 argomenti dei parametri della riga di comando e stampa 1 se i cerchi si sovrappongono, altrimenti 0.


0

Julia 0.6.0 (46 byte)

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

Accetta sei argomenti: x1, y1, r1, x2, y2, r2. Restituisce vero o falso.

Purtroppo, Clojure non ha una powsorta di funzione. Costa molti byte.


0

In realtà , 8 byte

-)-(h@+>

Provalo online!

Spiegazione:

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

Che valuta la funzione

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

Dove xsono le coordinate del cerchio 1, ysono le coordinate del cerchio 2 e zi raggi.

Calcola la distanza tra i due centri usando Pitagora e verifica se tale distanza è inferiore alla somma dei raggi.

Utilizza la vettorializzazione di R per calcolare (x1-x2)^2e (y1-y2)^2. Questi vengono quindi sommati e radicati in modo preciso.


0

Vai , 93 byte

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

Algoritmo abbastanza semplice, uguale a molte altre risposte, tranne per il fatto che utilizza il built-in complex e chiama math / cmplx.Abs ().

Prendere i raggi come numeri complessi non aiuta, perché il cast su float64 aggiunge più byte di quanti ne salva la dichiarazione di variabili (impossibile float64 < complex128 ).

Provalo online! Include i casi di test e utilizza il pacchetto main anziché una libreria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.