Breve Problema Explicação
Escreva um programa para encontrar a distância mínima entre dois pontos que viajam apenas em raios que emanam da origem e círculos centrados na origem.
Explicação da premissa
Agora vamos imaginar que estamos em um avião, e neste plano só podemos viajar de maneiras especiais. Estamos autorizados a viajar em qualquer raio que emana da origem.
Também podemos viajar em qualquer círculo centrado em um círculo
Agora, nosso objetivo é viajar de um ponto nesse avião para outro. No entanto, não podemos simplesmente viajar por um caminho euclidiano simples; só podemos fazer isso se os pontos caírem em um raio que emana do centro.
Podemos viajar nessa porque cai em um dos nossos raios.
Também podemos viajar em círculos centrados na origem.
Exemplos
Agora, aqui está o desafio:
Temos que ir de um ponto a outro no caminho mais curto; geralmente é uma combinação de viagens em círculos e raios.
Isso, no entanto, também pode estar viajando em dois raios.
Às vezes, existem dois caminhos que percorrem a distância mínima.
Problema
Seu desafio é escrever um programa que, quando dados dois pontos, nos dará a distância mínima entre eles, se seguirmos essas regras. As entradas podem ser dadas em formas retangulares ou polares e a saída deve ser um número, a distância entre elas.
Casos de teste
(com entrada retangular)
(1,1) (1,-1) -> ~ 2.22144
(0,0) (1, 1) -> ~ 1.41421
(1,0) (-0.4161 , 0.90929) -> ~ 2
(1,1) (1, 0) -> ~ 1.19961
(1,2) (3, 4) -> ~ 3.16609
fonte
Respostas:
Haskell,
4948 bytesUso:
Obrigado a @Zgarb por salvar um byte
fonte
(a!q)c r
vez ded a q c r
.JavaScript (ES6), 65 bytes
Toma coordenadas polares. Usa o truque do @Angs para reduzir um ângulo entre 0 e π. Para coordenadas retangulares, algo como isto funciona:
fonte
MATL , 22 bytes
Entrada é uma matriz de dois números complexos.
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Ruby, 64 bytes
Primeiro, minha submissão. Função Lambda com argumentos
distance 1, angle 1, distance 2, angle2
.Agora, aqui estão duas soluções diferentes de 66 bytes (excluindo a atribuição
f=
), seguidas pelo meu envio real novamente em 64 bytes.O envio é baseado na solução 2, mas usa a identidade
(s-r).abs
=s+r-[s,r].min*2
para encurtar o código em 2 bytes, daí o-2
interior dos colchetes.O outro recurso notável é a expressão
?i.to_c.arg*4
= 2 * PI sem usarinclude Math
. Se menor precisão é aceitável, isso pode ser substituído por um literal.Solução 2 comentada no programa de teste
Saída
fonte
Mathematica 66 Bytes
Isso requer coordenadas retangulares e pode gerar uma solução simbólica exata
Uso:
rendimentos:
N @% de rendimento:
{2.221441469, 1.414213562, 1.999934259, 1.199611726, 3.166096674}
fonte
Python 2,
164126125132 bytes:No momento, estou olhando mais para o golfe. Aceita coordenadas polares. Deve ser chamado no formato
A(r1,θ1,r2,θ2)
. Emite um valor de ponto flutuante com precisão de até12
números significativos.Experimente Online! (Ideona)
Uma implementação simples e direta que calcula e gera como STDOUT o valor mínimo de uma matriz de no máximo 3 valores contendo:
r1+r2
) ou do comprimento do arco que liga os dois pontos ser1==r2
;abs(r1-r2)
) iffθ1==θ2
(isto é, os dois pontos são colineares);''
) como aparentemente em Python, uma string será maior que qualquer número inteiro;fonte
math.pi
?Wolfram Language (Mathematica) , 47 bytes
Experimente online!
(supera a atual resposta de 66 bytes)
Tome entrada como 2 números complexos.
Pode haver alguns problemas se a entrada for simbólica. (por exemplo,
Cos@2 + I Sin@2
)fonte