Trilate sua posição

11

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 é , 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 xe ysendo as coordenadas e dsendo a distância até esse ponto. Os 3 desses pontos são organizados em uma lista. A saída será xe, yem 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!

Denker
fonte
Como ele precisa se encaixar em um plano cartesiano bidimensional, o código precisa ser o mais curto possível.
wizzwizz4
Você obviamente está usando resultados inexatos que ainda podem resultar em ambiguidade, como devemos lidar com isso?
flawr
@flawr Suponha que todos os resultados sejam exatos e únicos. Seu programa deve funcionar para casos com muito poucas casas decimais, não se preocupe com a ambiguidade. Vou limpar o desafio quando estiver em casa.
21416 Denker
Como a resposta aceita é efetivamente apenas uma calculadora gráfica, mencionarei que há uma solução de 96 bytes no TI-Basic (versão de 68k). Para esclarecer, é 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.
Fox

Respostas:

4

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, Be Csão as distâncias para os pontos (a,b), (c,d), e (E,f), respectivamente. Para obter uma raiz quadrada no valor, digite sqrto valor na caixa.

\left(x-a\right)^2+\left(y-b\right)^2=AA
\left(x-c\right)^2+\left(y-d\right)^2=BB
\left(x-E\right)^2+\left(y-f\right)^2=CC

Verifique o primeiro caso de teste .

Ou você pode dar uma olhada aqui:

círculos!

Conor O'Brien
fonte
Parece bom, mas isso satisfaz nossos critérios para linguagens de programação? Isso parece uma ferramenta de plotagem para mim, nunca a usei, por isso posso estar errado.
Denker
1
@ DenkerAffe Na verdade, eu fiz uma pergunta sobre isso na meta antes , e isso realmente conta.
Conor O'Brien
2
Tudo bem, tenho o meu upvote então :)
Denker
Eu discuto a contagem de bytes. Você clica no ponto de intersecção gratuitamente, o que não parece correto.
precisa saber é o seguinte
@lirtosiast Eu diria que o ponto está sempre lá por definição e afirma que o OP disse que esse tipo de interação era aceitável. Se, no entanto, você acredita que deve haver alguma penalidade, estou aberto a sugestões.
Conor O'Brien
4

C, 362 348 345 bytes

A 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.

#define F"%f "
#define G float
#define T(x)(b.x*b.x-a.x*a.x)
typedef struct{G a;G b;G c;}C;G f(C a,C b,G*c){G x=b.b-a.b;*c=(T(a)+T(b)-T(c))/x/2;return(a.a-b.a)/x;}main(){C a,b,c;G x,y,z,t,m;scanf(F F F F F F F F F,&a.a,&a.b,&a.c,&b.a,&b.b,&b.c,&c.a,&c.b,&c.c);x=f(a,a.b==b.b?c:b,&y);z=f(b.b==c.b?a:b,c,&t);m=t-y;m/=x-z;printf(F F"\n",m,x*m+y);}

Cé um tipo de estrutura cujos membros são uma coordenada x a, uma coordenada y be uma distância (raio) c. A função fleva duas Cestruturas e um ponteiro para um flutuador e determina a linha na qual os C(círculos) se cruzam. A interceptação em y dessa linha é colocada no flutuador apontado para e a inclinação é retornada.

O programa chama fdois pares de círculos e determina a interseção das linhas produzidas.

Raposa
fonte
Como esclarecemos que as entradas não são colineares, as linhas fproduzidas 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.
Fox
2

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!

import numpy as N
def L(P):
    Z=[p[2]**2-p[0]**2-p[1]**2 for p in P];return N.linalg.solve([[P[i][0]-P[0][0],P[i][1]-P[0][1]]for i in[1,2]],[(Z[0]-Z[i])*0.5 for i in [1,2]])
RT
fonte
Você pode omitir alguns espaços em branco aqui. Algo como -1 if 1 else 1pode se tornar, -1if 1else 1por exemplo. Isso também funciona com colchetes. Existem alguns lugares onde você pode tirar proveito disso. Também .5é o mesmo que 0.5.
21416 Denker