Lingkari Tiga Poin

13

Dengan koordinat tiga titik Cartesian pada sebuah pesawat, temukan persamaan lingkaran melalui semuanya. Tiga poin tidak akan berada di garis lurus.

Setiap baris input ke program Anda akan berisi koordinat xdan ytiga titik, dalam urutan A(x),A(y),B(x),B(y),C(x),C(y). Koordinat ini akan menjadi bilangan real kurang dari 1.000.000 yang dipisahkan satu sama lain oleh ruang.

Solusinya harus dicetak sebagai persamaan bentuk (x-h)^2 + (y-k)^2 = r^2. Nilai untuk h, k, rharus dicetak dengan tiga digit setelah titik desimal. Tanda plus dan minus dalam persamaan harus diubah sesuai kebutuhan untuk menghindari beberapa tanda sebelum angka.

Sample Inputs

7.0 -5.0 -1.0 1.0 0.0 -6.0
1.0 7.0 8.0 6.0 7.0 -2.0

Sample Outputs

(x - 3.000)^2 + (y + 2.000)^2 = 5.000^2
(x - 3.921)^2 + (y - 2.447)^2 = 5.409^2
fR0DDY
sumber
Bisakah kita menggunakan persamaan kutub atau parametrik saja?
Peter Olson
@ Peter Tidak. Dengan begitu akan sulit untuk membandingkan dengan jawaban lain.
fR0DDY
Apa yang seharusnya menjadi output jika tidak ada solusi yang unik? Apa kendala yang ada pada ketahanan numerik?
Peter Taylor
@ peter-taylor Diberikan dalam pernyataan masalah bahwa 'Tiga poin tidak akan berada pada garis lurus.'
fR0DDY
2
Memang, ini hanya beberapa karakter jadi ini bukan kata-kata kasar bahwa solusi saya bisa menjadi lebih pendek, hanya pertanyaan jujur ​​... tetapi jika spasi putih dalam spesifikasi output, bukankah itu wajib? Kalau tidak, dalam golf kode, mengapa ada yang memenuhi spesifikasi output?
Rebecca Chernoff

Jawaban:

6

Python, 176 189 karakter

import sys,re
for s in sys.stdin:x,y,z=eval(re.sub(r'(\S+) (\S+)',r'\1+\2j,',s));w=z-x;w/=y-x;c=(x-y)*(w-abs(w)**2)/2j/w.imag-x;print'(x%+.3f)^2+(y%+.3f)^2=%.3f^2'%(c.real,c.imag,abs(c+x))

Melakukan semua pekerjaannya di pesawat kompleks. Saya menghitung matematika dari bagian bawah halaman ini . -cadalah pusat lingkaran.

Keith Randall
sumber
@ Joey: ya, salahku. Tetap.
Keith Randall
2

C # - 490

using System;class C{static void Main(){Func<string,double>p=s=>double.Parse(s);Func<double,string>t=s=>(s<0?"+ ":"- ")+Math.Abs(s).ToString("F3");foreach(var l in System.IO.File.ReadAllLines("i")){var v=l.Split();double a=p(v[0]),b=p(v[1]),c=p(v[2]),d=p(v[3]),e=p(v[4]),f=p(v[5]),m=(d-b)/(c-a),n=(f-d)/(e-c),x=(m*n*(b-f)+n*(a+c)-m*(c+e))/(2*(n-m)),y=-(x-(a+c)/2)/m+(b+d)/2,r=Math.Sqrt((x-a)*(x-a)+(y-b)*(y-b));Console.WriteLine("(x "+t(x)+")^2+(y "+t(y)+")^2 = "+r.ToString("F3")+"^2");}}}

Ini menemukan 2 garis antara AB dan BC. Kemudian ia menemukan di mana dua bagian dari 2 garis itu bersilangan. (Yang saya perhatikan adalah apa yang @PeterTaylor katakan dalam komentarnya ke @PeterOfTheCorn.)

Rebecca Chernoff
sumber
2

Ruby, 192 karakter

$<.map{|l|a,b,c,d,e,f=l.split.map &:to_f
n=(f-d)/(e-c)
puts"(x%+.3f)^2+(y%+.3f)^2=%.3f^2"%[x=-(n*(a+c)+(n*(b-f)-(c+e))*m=(d-b)/(c-a))/2/n-=m,y=-(x+(a+c)/2)/m-(b+d)/2,((a+x)**2+(b+y)**2)**0.5]}

Contoh penggunaan:

$ echo "7.0 -5.0 -1.0 1.0 0.0 -6.0
1.0 7.0 8.0 6.0 7.0 -2.0" | ruby circle.rb
(x-3.000)^2+(y+2.000)^2=5.000^2
(x-3.921)^2+(y-2.447)^2=5.409^2
Ventero
sumber
Menerapkan penugasan ke x, ydan rdalam panggilan ke %akan membantu, jika memungkinkan.
Lowjacker
@ Joey: Maaf, ternyata melewatkan itu ketika membaca pertanyaan. Perbaiki sekarang.
Ventero
1

Wolfram Alpha (27)

Saya katakan, gunakan alat yang tepat untuk pekerjaan itu.

equation circle ([Input1],[Input2]),([Input3],[Input4]),([Input5],[Input6])

Contoh di sini .

Peter Olson
sumber
6
Tidak ada penanganan input? Tidak ada dukungan untuk beberapa saluran input? Saya akan mengatakan ini tidak memenuhi syarat.
Joey
0

Javascript (299)

Satu-satunya cara yang dapat saya pikirkan untuk menyelesaikan ini adalah secara aljabar menyelesaikan tiga persamaan untuk tiga yang tidak diketahui untuk menemukan h, k, dan r.

p=prompt().split(' ');a=p[0],b=p[1],c=p[2],d=p[3],e=p[4],f=p[5];h=((a*a+b*b)*(f-d)+(c*c+d*d)*(b-f)+(e*e+f*f)*(d-b))/(a*(f-d)+c*(b-f)+e*(d-b))/2;k=((a*a+b*b)*(e-c)+(c*c+d*d)*(a-e)+(e*e+f*f)*(c-a))/(b*(e-c)+d*(a-e)+f*(c-a))/2;r=Math.sqrt((a-h)*(a-h)+(b-k)*(b-k));alert("(x-"+h+")²+(y-"+k+")²="+r+"²");

Contoh I / O:

7.0 -5.0 -1.0 1.0 0.0 -6.0 -> (x-3)²+(y--2)²=5²

1.0 7.0 8.0 6.0 7.0 -2.0 -> (x-3.9210526315789473)²+(y-2.4473684210526314)² =5.409159155551175²

Satu-satunya bug yang saya lihat adalah bahwa jika h atau k negatif, ia mengeluarkan --bukan +.

Peter Olson
sumber
2
Itu bisa dilakukan dengan kompas dan ujung lurus. Ambil dua poin, gambar garis yang membagi dua. Ambil pasangan yang berbeda dari dua poin, lagi. Temukan persimpangan. Apakah itu mengarah pada kode yang lebih pendek, saya belum menyelidiki.
Peter Taylor
Ini hanya menangani satu baris input, bukan?
Joey
@ Joey, ya. Apakah masalah memerlukan penanganan beberapa saluran?
Peter Olson
1
Mengutip dari tugas: »Setiap baris input ke program Anda akan berisi koordinat x dan y dari tiga poin ...«
Joey