Apakah siklik segiempat ini?

18

Dalam matematika, segiempat siklik adalah salah satu yang semua simpulnya terletak pada lingkaran yang sama. Dengan kata lain, setiap simpul ada di lingkaran ketiga. Untuk informasi lebih lanjut, lihat artikel MathWorld .

Contohnya

Segiempat ini adalah siklik:

Segiempat siklik

Trapesium ini bukan siklik.

Trapesium

(Gambar dari Wikipedia)

Objektif

Dengan koordinat empat simpul dalam urutan berlawanan yang membentuk segiempat cembung, tentukan apakah segiempatnya siklik.

Koordinat akan menjadi bilangan bulat (namun, perhatikan bahwa koordinat circumcenter dan circumradius tidak harus bilangan bulat). Seperti yang tersirat dalam paragraf sebelumnya, tidak ada tiga poin yang akan co-linear dan tidak ada dua coincident.

I / O

Anda dapat mengambil input menggunakan format apa pun yang masuk akal. Secara khusus, [[x1,x2,x3,x4],[y1,y2,y3,y4]], [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]dan bilangan kompleks semua baik-baik saja.

Keluaran menggunakan nilai konsisten yang berbeda untuk benar dan salah.

Uji kasus

Benar:

[0,0], [314,0], [314,1], [0,1]
[-5,5], [5,-5], [1337,42], [42,1337]
[104, -233], [109, -232], [112, -231], [123, -224]

Salah:

[0,0], [314,0], [314,100], [0,99]
[31,41],[59,26],[53,58],[0,314]
lirtosiast
sumber

Jawaban:

11

Bahasa Wolfram (Mathematica) , 23 byte

#∈Circumsphere@{##2}&

Cobalah online!

Membawa empat input: daftar {x1,y1}, {x2,y2}, {x3,y3}, dan {x4,y4}. Periksa apakah titik pertama terletak pada lingkaran ketiga. Juga berfungsi untuk memeriksa apakah n+1 poin dalam Rn adalah concyclic, asalkan n terakhir dari mereka secara bebas independen (karena Circumspheresedih jika Anda memberikan input yang merosot).

Atau, berikut adalah pendekatan matematika:

Bahasa Wolfram (Mathematica) , 29 28 25 24 byte

Det@{#^2+#2^2,##,1^#}^0&

Cobalah online!

Mengambil dua daftar sebagai masukan: {x1,x2,x3,x4}dan {y1,y2,y3,y4}. Kembali Indeterminateketika empat poin berada di lingkaran yang sama, dan 1sebaliknya.

Dari empat titik (x1,y1),(x2,y2),(x3,y3),(x4,y4) , solusi ini membangun matriks di bawah ini:

[x12+y12x22+y22x32+y32x42+y42x1x2x3x4y1y2y3y41111]

Penentu matriks ini adalah 0 jika dan hanya jika keempat baris itu bergantung secara linier, dan ketergantungan linier antara baris adalah hal yang sama dengan persamaan lingkaran yang dipenuhi pada keempat titik.

Cara terpendek saya bisa memikirkan untuk memeriksa apakah determinan adalah 0 adalah untuk meningkatkan ke kekuasaan 0-th: 0^0adalah Indeterminatesementara yang lain memberikan 1.

Misha Lavrov
sumber
10

Python 3 , 70 byte

lambda b,c,d,e,a=abs:a(a(b-d)*a(c-e)-a(b-c)*a(d-e)-a(c-d)*a(b-e))<1e-8

Cobalah online!

Saya menggunakan teorema Ptolemeus .

Dalam segiempat, jika jumlah produk dari dua pasang sisi yang berlawanan sama dengan produk diagonal, maka segi empat dapat ditulisi dalam lingkaran.

b, c, d, eAdalah bilangan kompleks.

Кирилл Малышев
sumber
8

Perl 6 , 44 byte

{!im ($^b-$^a)*($^d-$^c)/(($d-$a)*($b-$c)):}

Cobalah online!

Mengambil simpul sebagai bilangan kompleks. Menggunakan fakta bahwa jumlah sudut yang berlawanan adalah 180 ° dalam segiempat siklik. Urutan operasi harus menjamin bahwa operasi titik-mengambang menghasilkan hasil yang tepat untuk bilangan bulat (cukup kecil).

Solusi TI-Basic dari Port of Misha Lavrov, 33 byte

{![*](map */*,($_ Z-.rotate)).im}

Cobalah online!

nwellnhof
sumber
42? Apakah masih akurat?
Jo King
1
@ JoKing Tidak, tidak .
nwellnhof
Apa yang dilakukan usus besar dalam kasus ini? Ini jelas bukan label, dan juga bukan pemanggilan metode.
user202729
@ user202729 Ini adalah pemanggilan metode dengan sintaks invokasi tidak langsung .
nwellnhof
6

JavaScript (ES6)

Menguji sudut, 114 byte

[x1,y1,x2,y2,x3,y3,x4,y4]

a=>(F=i=>(A=Math.atan2)(a[i+3&7]-(y=a[i+1]),a[i+2&7]-a[i])-A(a[i+5&7]-y,a[i+4&7]-a[i]))(0)+F(2)+F(4)+F(6)==Math.PI

Cobalah online!


Menghitung determinan, 130 byte

[x1,x2,x3,x4][y1,y2,y3,y4]

Yang ini setara dengan jawaban ke-2 MishaLavrov , dengan matriks yang diputar.

x=>y=>!(g=a=>a+a?a.reduce((v,[r],i)=>v+(i&1?-r:r)*g(a.map(r=>r.slice(1)).filter(_=>i--)),0):1)(x.map((X,i)=>[1,Y=y[i],X,X*X+Y*Y]))

Cobalah online!

Arnauld
sumber
6

TI-Basic (83 series), 21 byte

e^(ΔList(ln(ΔList(augment(Ans,Ans
not(imag(Ans(1)Ans(3

Mengambil input sebagai daftar dari empat bilangan kompleks di Ans. Mengembalikan 1jika segiempat adalah siklik dan 0sebaliknya.

z1,z2,z3,z4

  • ΔList(augment(Ans,Ansz2-z1,z3-z2,z4-z3,z1-z4
  • e^(ΔList(ln(z3-z2z2-z1,z4-z3z3-z2,z1-z4z4-z3,...
  • z3-z2z2-z1z1-z4z4-z3 (z3,z1;z2,z4)=z2-z3z2-z1:z4-z3z4-z1

Saya melakukan yang terbaik untuk memeriksa apakah kesalahan numerik adalah masalah, dan sepertinya tidak, tetapi jika ada orang yang memiliki kasus pengujian yang baik untuk itu, beri tahu saya.

Misha Lavrov
sumber
3

JavaScript (ES6) (101 byte)

p=>(h=(a,b)=>Math.hypot(p[a]-p[b],p[a+1]-p[b+1]))&&((h(2,4)*h(0,6)+h(0,2)*h(4,6)-h(0,4)*h(2,6))<1e-8)

Mengambil input sebagai [x1,y1,x2,y2,x3,y3,x4,y4], menghasilkan Boolean.

ef=Sebuahc+bd
e,fSebuah,b,c,d

Cobalah online!

Alvin Li
sumber
2

Jelly , 11 byte

²Sṭ;L€€ṖÆḊ¬

Cobalah online!

Menggunakan pendekatan determinan dari solusi Mathematica Misha Lavrov . Output 1 untuk true, 0 untuk false.

Bagaimana itu bekerja

²Sṭ;L€€ṖÆḊ¬  Main link (monad). Input: [[x1,x2,x3,x4], [y1,y2,y3,y4]]
²S           Square each scalar and add row-wise; [x1*x1+y1*y1, ...]
  ṭ          Append to the input
   ;L€€      Add two rows of [1,1,1,1]'s
       Ṗ     Remove an extra row
        ÆḊ¬  Is the determinant zero?

Jelly , 12 byte

Iµ÷×ƭ/÷SµḞ=A

Cobalah online!

Menggunakan pendekatan rasio silang berbelit-belit dari solusi TI-Basic Misha Lavrov . Output 1 untuk true, 0 untuk false.

Bagaimana itu bekerja

Iµ÷×ƭ/÷SµḞ=A  Main link (monad). Input: list of four complex numbers [z1,z2,z3,z4]
I             Increments; [z2-z1, z3-z2, z4-z3]
 µ            Refocus on above for sum function
  ÷×ƭ/÷S      (z2-z1)÷(z3-z2)×(z4-z3)÷(z4-z1)
        µ     Refocus again
         Ḟ=A  (real part) == (norm) within error margin
              i.e. imag part is negligible?

Saya percaya keduanya golf ...

Bubbler
sumber