Trilaterate la vostra posizione


11

introduzione

Immagina di essere su un piano cartesiano bidimensionale e di voler determinare la tua posizione su di esso. Conosci 3 punti su quell'aereo e la tua distanza da ognuno di essi. Mentre è sempre possibile calcolare la tua posizione da quello, farlo nella tua testa è piuttosto difficile. Quindi decidi di scrivere un programma per quello.

La sfida

Dato 3 punti e la distanza da loro, emetti le coordinate della tua posizione.

  • L'input e l'output possono essere in qualsiasi formato conveniente, incluso l'uso di numeri complessi anziché reali. Si prega di chiarire nella risposta quale formato si utilizza.
  • Otterrai sempre esattamente 3 punti distinti con la loro distanza.
  • Le coordinate e le distanze saranno galleggianti con precisione arbitraria. L'output deve essere corretto con 3 cifre decimali. L'arrotondamento dipende da te. Si prega di chiarire nella risposta.
  • Puoi presumere che i tre punti non siano collineari, quindi ci sarà sempre una soluzione unica.
  • Non ti è permesso di rinforzare la soluzione.
  • Non è possibile utilizzare alcun builtin che banalizzi questo particolare problema. Tuttavia, sono consentiti i builtin per le norme vettoriali, ecc.

Suggerimento per iniziare:

Pensa a un cerchio attorno a ciascuno di quei 3 punti con la loro distanza come raggio.

Regole

Casi test

Il formato di input per un punto qui è [[x,y],d]con xed yessendo le coordinate ed dessendo la distanza da questo punto. I 3 di questi punti sono disposti in un elenco. L'output sarà xe quindi yin un elenco.

[[[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]

Puoi generare ulteriori casi di test con questo programma Pyth . La posizione va sulla prima riga dell'ingresso e i 3 punti si trovano sulle 3 righe seguenti.

Buona programmazione!


Poiché deve adattarsi a un piano cartesiano bidimensionale, il codice deve essere il più breve possibile.
wizzwizz4,

Ovviamente stai usando risultati inesatti che possono ancora provocare ambiguità, come dovremmo gestirli?
flawr

@flawr Basta supporre che tutti i risultati siano esatti e unici. Il tuo programma dovrebbe funzionare per casi con pochissime cifre decimali, non preoccuparti dell'ambiguità. Pulirò la sfida quando sarò a casa.
Denker,

Poiché la risposta accettata è effettivamente solo una calcolatrice grafica, menzionerò che esiste una soluzione a 96 byte in TI-Basic (versione 68k). Per chiarire, solve(date tre equazioni circolari) è banalizzare il problema? Ho pensato che lo fosse, ma se stai bene con queste cose andrò avanti e pubblicherò.
Fox,

Risposte:


4

Desmos, 122 byte

Uso online . Copia + incolla ogni equazione in una casella di equazione, fai clic su "aggiungi tutto" per ogni casella, quindi fai clic sul punto di intersezione, quindi inserisci ciascun valore come appropriato. ciascuna A, Be Csono le distanze per i punti (a,b), (c,d), e (E,f), rispettivamente. Per ottenere una radice quadrata nel valore, digitare sqrtquindi il valore nella casella.

\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

Verifica il primo caso di test .

Oppure puoi dare un'occhiata qui:

cerchi!


Sembra piuttosto carino, ma soddisfa i nostri criteri per i linguaggi di programmazione? Questo sembra proprio uno strumento per la stampa, non l'ho mai usato, quindi potrei sbagliarmi.
Denker


2
Bene, allora ho il mio voto :)
Denker

Contesto il conteggio dei byte. Fai clic sul punto di intersezione gratuitamente, il che non sembra corretto.
lirtosiast

@lirtosiast Direi che il punto è sempre presente per definizione e afferma inoltre che l'OP ha affermato che questo tipo di interazione andava bene. Se, tuttavia, ritieni che ci dovrebbe essere qualche penalità, sono aperto a suggerimenti.
Conor O'Brien,

4

C, 362 348 345 byte

Ingresso è data come una sequenza di carri separati da spazi stdin: x1 y1 d1 x2 y2 d2 x3 y3 d3. L'uscita è simile su 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è un tipo di struttura i cui membri sono una coordinata x a, una coordinata y be una distanza (raggio) c. La funzione fprende due Cstrutture e un puntatore a un float e determina la linea in cui i C(cerchi) si intersecano. L'intercetta y di questa linea viene posizionata nel galleggiante da punta a punta e la pendenza viene restituita.

Il programma chiama fdue coppie di cerchi, quindi determina l'intersezione delle linee prodotte.


Poiché abbiamo chiarito che gli input non sono collineari, le linee fprodotte non saranno mai parallele. I test mirano a garantire che non siano anche verticali, poiché sto usando la forma di intercettazione dell'inclinazione. In questo modo, c'è sempre esattamente una risposta.
Fox,

2

Python - 172

Prende l'input come un elenco di tuple di forma (x, y, d). Fammi sapere se vedi un modo per giocare a golf così ulteriormente, sento che ci deve essere ma non riesco a capirlo!

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]])

Puoi omettere alcuni spazi bianchi qui. Qualcosa del genere -1 if 1 else 1può diventare -1if 1else 1ad esempio. Funziona anche con parentesi: ci sono alcuni posti in cui puoi trarne vantaggio. Inoltre .5è lo stesso di 0.5.
Denker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.