Dadas as coordenadas dos centros e os raios de 2 círculos, produza um valor verdadeiro de que elas se sobrepõem ou não.
Entrada
A entrada pode ser obtida via STDIN ou argumentos de função equivalentes, mas não como uma variável. Você pode tomá-los como uma única variável (lista, string etc.) ou como várias entradas / argumentos, na ordem que desejar.
A entrada será seis carros alegóricos. Esses carros alegóricos terão até três casas decimais. As coordenadas podem ser positivas ou negativas. Os raios serão positivos.
Saída
A saída pode ser via STDOUT ou retorno de função.
O programa deve ter exatamente 2 saídas distintas - uma para um valor True (os círculos se sobrepõem) e outra para uma saída False (elas não se sobrepõem).
Casos de teste
(A entrada é fornecida como uma lista de tuplas [(x1, y1, r1), (x2, y2, r2)]
para os casos de teste; você pode receber entradas em qualquer formato)
Verdade
[(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 é o Code Golf, a resposta mais curta em bytes ganha.
Respostas:
Geléia , 5 bytes
Toma dois números complexos (centros) como primeiro argumento e dois números reais (raios) como segundo argumento.
Experimente online!
Como funciona
fonte
A
daqui seria considerado a norma do vetor de linha "centros"? (ÆḊ
-Se erros com conteúdo complexo.)A
calcula as distâncias dos centros como a norma do seu vetor de diferença.JavaScript (ES6), 38 bytes
Aceita entrada como 6 variáveis distintas x1 , y1 , r1 , x2 , y2 , r2 .
Casos de teste
Mostrar snippet de código
fonte
a:Double,x:Double,b:Double,y:Double,r:Double,q:Double
.Pitão, 5 bytes
Formato de entrada:
Experimente online
Como funciona
fonte
MATL , 5 bytes
O formato de entrada é:
Experimente online! Ou verifique todos os casos de teste .
Como funciona
fonte
5
bytes (-|
em vez deZP
)-r2
vez der2
, ajudaria, porque então você precisaria de três diferenças, em vez de duas e uma adição ... É melhor eu correr antes de me aprofundar demais!R , 39 bytes
recebe entrada
k=c(x1,x2,y1,y2)
er=c(r1,r2)
; retornaFALSE
para círculos tangentes.Experimente online!
27 bytes:
Recebe entrada como uma matriz com os centros dos círculos dados como linhas e um vetor de raios.
Experimente online!
fonte
function(k,r)dist(matrix(k,2))<sum(r)
dist(matrix(scan(),2))<sum(scan())
?Python , 40 bytes
Experimente online!
Usa a aritmética complexa do Python para calcular a distância entre os dois centros. Estou assumindo que não podemos pegar os pontos de entrada diretamente como números complexos, então o código os expressa como
x+y*1j
.fonte
Python 3 , 45 bytes
Experimente online!
fonte
05AB1E , 6 bytes
Experimente online!
-1 byte usando em
a - b > 0
vez de(reverse) b - a < 0
fonte
Python 3 , 45 bytes
Experimente online!
-8 bytes graças a Neil / Step Hen
fonte
APL (Dyalog) , 10 bytes
Solicita centros circulares como lista de dois números complexos e, em seguida, raios como lista de dois números
Experimente online!
(+/⎕)
[é] a soma dos raios>
Melhor que|
a magnitude de-/⎕
a diferença de centrosfonte
Mathematica, 16 bytes
Entrada:
[{x1, y1}, {x2, y2}, r1, r2]
O Mathematica possui um
RegionIntersection
builtin, mas só ele possui 18 bytes de comprimento ...Versão incorporada:
Leva 2
Disk
objetos.[Disk[{x1, y1}, r1], Disk[{x2, y2}, r2]]
.fonte
Haskell ,
3736 bytesExperimente online!
Obrigado @AndersKaseorg pelo
-1
byte!fonte
(u!v)r x y s
.Gelatina , 12 bytes
Experimente online!
-2 bytes graças a Dennis
fonte
ạ/²
mesmos bytes?I
vez de reduzir pela diferença absoluta.Java (OpenJDK 8) , 38 bytes
Experimente online!
fonte
Java 8,
4138 bytesExperimente aqui.
Aparentemente, Java também possui
Math.hypot
, que é 3 bytes mais curto.EDIT: Acabei de perceber que esta resposta agora é exatamente a mesma que a resposta do Java 8 de @ OlivierGrégoire , portanto, faça um voto positivo em vez de mim, se você gosta da resposta de 38 bytes.
Resposta antiga (41 bytes) :
Experimente aqui.
fonte
Pitão , 15 bytes
Recebe entradas na ordem x1, x2, y1, y2, r1, r2
Suíte de teste!
fonte
Perl 6 , 13 bytes
Experimente online!
Os dois primeiros argumentos são os raios, em qualquer ordem. O terceiro e o quarto argumentos são as coordenadas dos centros, como números complexos, em qualquer ordem.
fonte
Táxi , 1582 bytes
Experimente online!
Saídas
1
para círculos sobrepostos.Saídas
0
para círculos sem sobreposição (incluindo círculos tangenciais).Sem Golfe / formatado:
fonte
C #,
5041 bytesGuardado 9 bytes graças a @KevinCruijssen.
fonte
(r+R)*2
vez de(r+R)+(r+R)
?+
o RHS deveria ter sido um*
.Scala , 23 bytes
Obrigado @Arnauld por sua resposta quase poliglota .
Experimente online!
fonte
PostgreSQL, 41 caracteres
Instrução preparada, recebe entrada como 2 parâmetros em qualquer
circle
notação .Exemplo de execução:
fonte
Java,
5038 bytesfonte
(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R
. De fato, acabei de perceber que isso é exatamente o mesmo que a resposta JavaScript de Arnauld.Código da máquina x86 (com SSE2), 36 bytes
A função acima aceita descrições de dois círculos (coordenadas x e y do ponto central e um raio) e retorna um valor booleano indicando se eles se cruzam ou não.
Ele usa uma convenção de chamada de vetor, na qual os parâmetros são passados nos registros SIMD. No Windows x86-32 e 64 bits, esta é a
__vectorcall
convenção de chamada . No Unix / Linux / Gnu de 64 bits, esta é a convenção de chamada padrão do System V AMD64 .O valor de retorno é deixado no byte baixo de
EAX
, como é padrão em todas as convenções de chamada x86.Esse código funciona igualmente bem em processadores x86 de 32 e 64 bits, desde que eles suportem o conjunto de instruções SSE2 (que seria Intel Pentium 4 e posterior, ou AMD Athlon 64 e posterior).
Versão AVX, ainda 36 bytes
Se você estava segmentando o AVX , provavelmente desejaria adicionar um prefixo VEX às instruções. Isso não altera a contagem de bytes; apenas os bytes reais usados para codificar as instruções:
As instruções do AVX têm a vantagem de levar três operandos, permitindo executar operações não destrutivas, mas isso não nos ajuda a compactar o código aqui. No entanto, misturar instruções com e sem prefixos VEX pode resultar em código subótimo; portanto, você geralmente deseja seguir todas as instruções do AVX se estiver direcionando o AVX e, nesse caso, nem sequer prejudica sua contagem de bytes.
fonte
05AB1E , 10 bytes
Experimente online!
fonte
PHP , 66 bytes
Experimente online!
Executa a partir da linha de comando, recebendo a entrada como 6 argumentos de parâmetro da linha de comando e imprime 1 se os círculos se sobrepõem, caso contrário, 0.
fonte
Julia 0.6.0 (46 bytes)
fonte
Clojure, 68 bytes
Leva seis argumentos: x1, y1, r1, x2, y2, r2. Retorna verdadeiro ou falso.
Infelizmente, Clojure não tem uma
pow
função de algum tipo. Custa muitos bytes.fonte
Na verdade , 8 bytes
Experimente online!
Explicação:
fonte
R (+ pryr), 31 bytes
Que avalia a função
Onde
x
estão as coordenadas do círculo 1,y
são as coordenadas do círculo 2 ez
os raios.Calcula a distância entre os dois centros usando Pitágoras e testa se essa distância é menor que a soma dos raios.
Utiliza a vetorização de R para calcular
(x1-x2)^2
e(y1-y2)^2
. Estes são então somados e diretamente enraizados.fonte
Go , 93 bytes
Algoritmo bastante simples, igual a várias outras respostas, exceto que ele usa o
complex
tipo interno e chama math / cmplx.Abs ().Tomar os raios como números complexos não ajuda, porque a conversão para float64 adiciona mais bytes do que a declaração da variável salva (não é possível fazer
float64 < complex128
).Experimente online! Inclui os casos de teste e usa o pacote principal em vez de uma biblioteca.
fonte