Trilasikan posisi Anda


11

pengantar

Bayangkan Anda berada di pesawat kartesius dua dimensi dan ingin menentukan posisi Anda di atasnya. Anda tahu 3 poin di pesawat itu dan jarak Anda ke masing-masing. Meskipun selalu mungkin untuk menghitung posisi Anda dari itu, melakukan hal itu di kepala Anda cukup sulit. Jadi Anda memutuskan untuk menulis program untuk itu.

Tantangan

Diberikan 3 poin dan jarak Anda dengan mereka, output kordinat posisi Anda.

  • Input dan output mungkin dalam format apa pun yang nyaman, termasuk menggunakan kompleks bukan bilangan real. Harap jelaskan dalam jawaban Anda format mana yang Anda gunakan.
  • Anda akan selalu mendapatkan 3 poin berbeda dengan jarak mereka ke Anda.
  • Koordinat dan jarak akan mengapung dengan presisi sewenang-wenang. Output Anda harus benar hingga 3 tempat desimal. Pembulatan terserah Anda. Harap jelaskan jawaban Anda.
  • Anda mungkin berasumsi bahwa ketiga poin tersebut bukan collinear, jadi akan selalu ada solusi unik.
  • Anda tidak boleh memaksa solusi.
  • Anda tidak boleh menggunakan bawaan apa pun yang meremehkan masalah khusus ini. Dibangun untuk norma-norma vektor, dll diperbolehkan.

Petunjuk untuk memulai:

Pikirkan tentang lingkaran di sekitar masing-masing 3 titik dengan jarak mereka kepada Anda sebagai jari-jari.

Aturan

  • Fungsi atau program lengkap diizinkan.
  • Aturan default untuk input / output.
  • Celah standar berlaku.
  • Ini adalah , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.

Uji kasus

Format input untuk satu titik di sini adalah [[x,y],d]dengan xdan ymenjadi koordinat dan dmenjadi jarak ke titik ini. 3 poin tersebut diatur dalam daftar. Output akan xdan kemudian ydalam daftar.

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

Anda dapat membuat test case tambahan dengan program Pyth ini . Lokasi berada pada baris pertama input dan 3 poin berada pada 3 baris berikut.

Selamat Coding!


Karena itu perlu masuk ke pesawat Cartesian dua dimensi, kode harus sesingkat mungkin.
wizzwizz4

Anda jelas menggunakan hasil yang tidak tepat yang masih dapat menyebabkan ambiguitas, bagaimana kami harus mengatasinya?
flawr

@ flawr Asumsikan saja bahwa semua hasil sama persis dan unik. Program Anda harus bekerja untuk kasus dengan tempat desimal sangat sedikit, jangan khawatir tentang ambiguitas. Saya akan membersihkan tantangan ketika saya pulang.
Denker

Karena jawaban yang diterima secara efektif hanya kalkulator grafik, saya akan menyebutkan bahwa ada solusi 96-byte di TI-Basic (versi 68k). Untuk memperjelas, apakah solve(diberi persamaan tiga lingkaran) meremehkan masalah? Saya pikir itu, tetapi jika Anda baik-baik saja dengan hal-hal seperti itu saya akan pergi dan mempostingnya.
Fox

Jawaban:


4

Desmos, 122 byte

Penggunaan online . Salin + rekatkan setiap persamaan ke dalam kotak persamaan, klik "tambahkan semua" untuk setiap kotak, lalu klik pada titik persimpangan, lalu masukkan di setiap nilai yang sesuai. masing-masing A, Bdan Cadalah jarak untuk poin (a,b), (c,d)dan (E,f)masing-masing. Untuk mendapatkan akar kuadrat dalam nilai, ketikkan sqrtkemudian nilai dalam kotak.

\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

Verifikasi kasus uji pertama .

Atau Anda bisa melihatnya di sini:

lingkaran!


Ini terlihat cukup bagus, tetapi apakah ini memenuhi kriteria kami untuk bahasa pemrograman? Ini terlihat seperti alat untuk merencanakan bagi saya, tidak pernah menggunakannya, jadi saya mungkin salah.
Denker


2
Baiklah, dapatkan upvote saya :)
Denker

Saya membantah jumlah byte. Anda dapat mengklik titik persimpangan secara gratis, yang sepertinya tidak benar.
lirtosiast

@ losiosiast Saya berpendapat bahwa intinya selalu ada menurut definisi dan lebih lanjut menyatakan bahwa OP mengatakan bahwa interaksi semacam ini baik-baik saja. Namun, jika Anda yakin harus ada penalti, saya terbuka untuk saran.
Conor O'Brien

4

C, 362 348 345 byte

Input diberikan sebagai urutan mengapung ruang-dipisahkan pada stdin: x1 y1 d1 x2 y2 d2 x3 y3 d3. Output mirip pada 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);}

Cadalah tipe struktur yang anggotanya adalah koordinat x a, koordinat y b, dan jarak (radius) c. Fungsi ini fmengambil dua Cstruktur dan pointer ke float, dan menentukan garis di mana C(lingkaran) berpotongan. Y-intersep dari garis ini ditempatkan ke float berujung-runcing, dan kemiringan dikembalikan.

Program memanggil fdua pasang lingkaran, kemudian menentukan persimpangan jalur yang dihasilkan.


Karena kami telah mengklarifikasi bahwa input tidak collinear, garis yang fdihasilkan tidak akan pernah paralel. Tes ini untuk memastikan mereka juga tidak vertikal, karena saya menggunakan bentuk slope-intercept. Dengan cara ini, selalu ada tepat satu jawaban.
Fox

2

Python - 172

Mengambil input sebagai daftar tupel formulir (x, y, d). Beritahu saya jika Anda melihat cara untuk bermain golf ini lebih jauh, saya merasa harus ada tetapi saya tidak bisa mengetahuinya!

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

Anda dapat menghilangkan beberapa spasi putih di sini. Sesuatu seperti -1 if 1 else 1bisa menjadi -1if 1else 1contohnya. Ini juga berfungsi dengan tanda kurung. Ada beberapa tempat di mana Anda dapat memanfaatkannya. Juga .5sama dengan 0.5.
Denker
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.