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.