Introdução
Imagine que você está em um plano cartesiano bidimensional e deseja determinar sua posição nele. Você conhece 3 pontos nesse avião e sua distância para cada um deles. Embora seja sempre possível calcular sua posição a partir disso, é muito difícil fazer isso na sua cabeça. Então você decide escrever um programa para isso.
O desafio
Dados 3 pontos e sua distância até eles, produza os cordinatos de sua posição.
- A entrada e a saída podem estar em qualquer formato conveniente, incluindo o uso de números complexos em vez de números reais. Esclareça na sua resposta qual formato você usa.
- Você sempre terá exatamente 3 pontos distintos com a sua distância para você.
- As coordenadas e distâncias serão flutuadas com precisão arbitrária. Sua saída deve estar correta com 3 casas decimais. O arredondamento depende de você. Esclareça na sua resposta.
- Você pode supor que os três pontos não são colineares; portanto, sempre haverá uma solução única.
- Você não tem permissão para forçar a solução.
- Você não pode usar nenhum componente interno que trivialize esse problema específico. No entanto, são permitidos builtins para normas de vetores etc.
Dica para começar:
Pense em um círculo em torno de cada um desses 3 pontos com a distância deles em relação a você como raio.
Regras
- Função ou programa completo permitido.
- Regras padrão para entrada / saída.
- Aplicam-se brechas padrão .
- Isso é código-golfe , e a menor contagem de bytes vence. O desempatador é uma inscrição anterior.
Casos de teste
O formato de entrada para um ponto aqui é [[x,y],d]
com x
e y
sendo as coordenadas e d
sendo a distância até esse ponto. Os 3 desses pontos são organizados em uma lista. A saída será x
e, y
em seguida, em uma lista.
[[[1, 2], 1.414], [[1, 1], 2.236], [[2, 2], 1.0]] -> [2, 3] [[[24.234, -13.902], 31.46], [[12.3242, 234.12], 229.953], [[23.983, 0.321], 25.572]] -> [-1.234, 4.567] [[[973.23, -123.221], 1398.016], [[-12.123, -98.001], 990.537], [[-176.92, 0], 912.087]] -> [12.345, 892.234]
Você pode gerar casos de teste adicionais com este programa Pyth . A localização vai na primeira linha da entrada e os 3 pontos estão nas 3 linhas a seguir.
Feliz codificação!
solve
(dadas três equações circulares) trivializar o problema? Eu pensei que era, mas se você estiver bem com essas coisas, eu vou em frente e postá-lo.Respostas:
Desmos, 122 bytes
Uso online . Copie + cole cada equação em uma caixa de equação, clique em "adicionar tudo" para cada caixa, clique no ponto de interseção e insira cada valor conforme apropriado. cada um dos
A
,B
eC
são as distâncias para os pontos(a,b)
,(c,d)
, e(E,f)
, respectivamente. Para obter uma raiz quadrada no valor, digitesqrt
o valor na caixa.Verifique o primeiro caso de teste .
Ou você pode dar uma olhada aqui:
fonte
C,
362348345 bytesA entrada é determinado como uma sequência de flutuadores separados por espaços em stdin:
x1 y1 d1 x2 y2 d2 x3 y3 d3
. Saída é semelhante em stdout:x y
.C
é um tipo de estrutura cujos membros são uma coordenada xa
, uma coordenada yb
e uma distância (raio)c
. A funçãof
leva duasC
estruturas e um ponteiro para um flutuador e determina a linha na qual osC
(círculos) se cruzam. A interceptação em y dessa linha é colocada no flutuador apontado para e a inclinação é retornada.O programa chama
f
dois pares de círculos e determina a interseção das linhas produzidas.fonte
f
produzidas nunca serão paralelas. Os testes são para garantir que eles também não sejam verticais, pois estou usando a forma de interceptação de inclinação. Dessa forma, sempre há exatamente uma resposta.Python - 172
Recebe a entrada como uma lista de tuplas de forma (x, y, d). Deixe-me saber se você encontrar uma maneira de jogar isso ainda mais, sinto que deve haver, mas não consigo descobrir!
fonte
-1 if 1 else 1
pode se tornar,-1if 1else 1
por exemplo. Isso também funciona com colchetes. Existem alguns lugares onde você pode tirar proveito disso. Também.5
é o mesmo que0.5
.