Aqui está outro simples:
O desafio
Dados dois pontos em um espaço n-dimensional, produza a distância entre eles, também chamada de distância euclidiana.
- As coordenadas serão números racionais; os únicos limites são as restrições do seu idioma.
- A dimensão mais baixa é 1, a mais alta é o que seu idioma pode suportar
- Você pode assumir que os dois pontos são da mesma dimensão e que não haverá entrada vazia.
- A distância deve estar correta com pelo menos 3 casas decimais. Se o seu idioma não suportar números de ponto flutuante, imprima o número inteiro mais próximo.
Regras
- Como de costume, função ou programa completo permitido.
- A entrada pode ser obtida de STDIN, linha de comando ou argumentos de função.
- O formato de entrada é seu, especifique qual você usou na sua resposta.
- A saída pode ser fornecida pela impressão em stdout ou valor de retorno.
- Isso é código-golfe, e a menor contagem de bytes ganha! Em caso de empate, a resposta anterior vence.
Casos de teste
Cada ponto é representado por uma lista de comprimento n.
[1], [3] -> 2
[1,1], [1,1] -> 0
[1,2], [3,4] -> 2.82842712475
[1,2,3,4], [5,6,7,8] -> 8
[1.5,2,-5], [-3.45,-13,145] -> 150.829382085
[13.37,2,6,-7], [1.2,3.4,-5.6,7.89] -> 22.5020221314
Feliz codificação!
code-golf
number
arithmetic
geometry
Denker
fonte
fonte
Respostas:
MATL , 2 bytes
Experimente online !
A
ZP
função (correspondente ao MATLABpdist2
) calcula todas as distâncias em pares entre dois conjuntos de pontos, usando a distância euclidiana por padrão. Cada conjunto de pontos é uma matriz e cada ponto é uma linha. Nesse caso, produz um único resultado, que é a distância entre os dois pontos.fonte
MATL,
3 bytes4,0Obrigado por -1 por @AndrasDeak!
Lê dois vetores (via entrada implícita solicitada por
-
) e depois os substratos e calcula a norma de sua diferença comZn
.Experimente Online!
fonte
Pitão, 2 bytes
Literalmente, uma função que faz esse problema
Experimente aqui.
fonte
Gelatina , 4 bytes
Experimente online!
Como funciona
fonte
Mathematica, 11 bytes
Entrada como duas listas, saída como um número. Se a entrada for exata (números inteiros, racionais, etc.), a saída também será exata. Se a entrada contiver um número de ponto flutuante, a saída também será flutuante.
fonte
EuclideanDistance
funcionaria muito bem também ... se o nome não fosse tão longo! Se ao menos houvesse "MATL for Mathematica", esse seria um único byte =)Oitava, 15 bytes
Exemplo:
fonte
CJam,
118 bytesAgradecimentos a Dennis por salvar 3 bytes.
Execute todos os casos de teste.
Explicação
Veja esta dica para saber por que
:mh
funciona.fonte
:mh
é realmente muito bomHaskell, 46 bytes
Haskell, 35 bytes (por @nimi)
Haskell, 31 bytes
<hack>
</hack>
Exemplos:
fonte
map
+uncurry
+zip
Raramente compensa, usozipWith
:d a=sqrt.sum.zipWith(((^2).).(-))a
.(.)
sempre retorna uma função que leva apenas um argumento ... Acho que você pode fazer algo como (.). (.), Mas isso realmente não vale a pena.APL,
1411 bytesEste é um trem de funções diádicas que pega os vetores à esquerda e à direita e retorna a norma euclidiana de sua diferença.
Explicação:
Experimente aqui
Economizou 3 bytes graças a Dennis!
fonte
.5*⍨(+/-×-)
salva alguns bytes.J, 9 bytes
Essa é uma função que retira um conjunto de coordenadas do outro (
-/>
) e executa uma soma+
abaixo do&.
quadrado*:
.A entrada deve estar no formato em
x y z;a b c
quex y z
é o seu primeiro conjunto de coordenadas ea b c
o outro.fonte
>
e especificar que a entrada deve ser fornecida comox y z,:a b c
.Java,
130117114107105 bytesEsta é a solução óbvia. Normalmente não jogo golfe em Java, mas fiquei curioso para ver se o Java poderia vencer a versão Brainfuck. Não parece que eu fiz um bom trabalho na época .. Talvez alguém possa usar o novo Map / Reduce do Java 8 para salvar alguns bytes.
Graças a @flawr (13 bytes), @KevinCruijssen (9 bytes) e @DarrelHoffman (3 bytes)!
Golfe:
Ungolfed:
fonte
for
loop será compactado paradouble x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);
double[]a,b->{double x=0,s;for(int i=0;++i<a.length;s=a[i]-b[i],x+=s*s);return Math.sqrt(x);}
para um total de 93 bytes.public
parte da frente do método para salvar 7 bytes e também pode colocar a partex+=s*s
externa do loop for para não precisar da vírgula (iefor(int i=-1;++i<a.length;s=a[i]-b[i])x+=s*s;
) para -1 byte.for(int i=0;i<a.length;x+=s*s)s=a[i]-b[i++];
(e eu também mudou o-1
que0
para um byte adicional)0
usando as regras de precedência do operador! Obrigado por me salvar um monte de bytes.Julia, 16 bytes
Esta é uma função que aceita duas matrizes e retorna a norma euclidiana de sua diferença como float.
Você pode verificar todos os casos de teste de uma vez online aqui .
fonte
golflua , 43 caracteres
Funciona chamando-o como
Um equivalente Lua seria
fonte
Sério, 12 bytes
Experimente online!
Explicação:
fonte
Ruby, 52
No programa de teste
fonte
AppleScript,
241239 bytesEste é um código de golfe, mas eu coloquei comentários no formulário
--
.Isso usa o mesmo algoritmo que a maioria dos outros programas aqui.
fonte
Perl 6,
30292624 bytes(Obrigado @ b2gills por mais 2 bytes perdidos)
uso
fonte
{sqrt [+] ([Z-] $_)»²}
JavaScript
ES7, 45ES6, 37 bytesEspera uma matriz de pares de coordenadas, uma de cada vetor, por exemplo
[[1, 5], [2, 6], [3, 7], [4, 8]]
. Se isso é inaceitável, então para 42 bytes:Espera duas matrizes de comprimento igual, correspondentes aos dois vetores N-dimensionais, por exemplo
[1, 2, 3, 4], [5, 6, 7, 8]
. Editar: salvou 3 bytes graças a @ l4m2. (Além disso, ninguém notou meu erro de digitação?)fonte
a=>b=>Math.hypot(...a.map((t,i)=>t-b[i]))
Python 2, 47 bytes
Uma solução direta. A função espera 2 pontos como sequências de números e retorna a distância entre eles.
Exemplo:
fonte
, 6 caracteres / 13 bytes
Try it here (Firefox only).
Calcula a norma de diferença de matrizes de entrada.
fonte
Scala,
6762 bytesRequer entrada como uma
sequência / vetor detuplas var-argExemplo:
fonte
C #, 72 bytes
Uma solução simples usando o Linq.
fonte
Sábio, 35 bytes
Esta função recebe 2 listas como entrada e retorna uma expressão simbólica. A distância é calculada executando a subtração do vetor nas listas e computando a norma euclidiana do vetor resultante.
Experimente online
fonte
TI-Basic (TI-84 Plus CE), 15 bytes
O TI-Basic é uma linguagem tokenizada .
Solicita a entrada como duas listas e retorna a distância euclidiana entre elas.
Ans
Explicação:
fonte
R, 4 bytes
Esta é uma função interna para calcular a matriz de distância de qualquer matriz de entrada. O padrão é a distância euclidiana.
Exemplo de uso:
Se você está se sentindo decepcionado por ser um built-in, aqui está uma versão não embutida (ou pelo menos menos embutida ...) para 22 bytes (com agradecimentos a Giuseppe ):
Esta é uma função anônima que recebe dois vetores como entrada.
fonte
function(x,y)norm(x-y,"F")
é mais curto que sua segunda versão.Haskell, 32 bytes
fonte
map
e parênteses).sqrt$sum$(^2)<$>zipWith(-)
não é uma função anônima válida. A regra subjacente é realmente bastante simples: se você pode escreverf = <mycode>
ef
depois executar a tarefa necessária,<mycode>
é uma função anônima válida. No seu caso, você precisa adicionarf p q = <mycode> p q
, por<mycode>
si só não é válido.Python 3, 70 caracteres
Faz um loop, encontrando o quadrado da diferença e depois a raiz da soma:
fonte
sum([(x-y)**2 for x,y in zip(a,b)])**.5
Mathcad, bytes
Usa o operador de magnitude vetorial (valor absoluto) interno para calcular o tamanho da diferença entre os dois pontos (expressos como vetores).
O tamanho do golfe do Mathcad fica em espera até que eu receba (ou alguém mais) aconteça para abrir a discussão sobre a meta. No entanto, o caminho mais curto (supondo que a entrada dos vetores de pontos não contribua para a pontuação) é de 3 "bytes", com 14 bytes para a versão funcional.
fonte
Pyke, 7 bytes
Experimente aqui!
Transponha, aplique subtrair, mapear quadrado, soma, sqrt.
fonte
Ruby, 50 bytes
Feche e mapeie / reduza. Quase não responde a outra resposta Ruby de @LevelRiverSt por 2 bytes ...
Experimente online
fonte