Czy to jest czworoboczne cykliczne?

18

W matematyce cykliczny czworokąt to taki, którego wierzchołki leżą na tym samym kole. Innymi słowy, każdy wierzchołek znajduje się na obwodzie pozostałych trzech. Aby uzyskać więcej informacji, zobacz artykuł MathWorld .

Przykłady

Te czworokąty są cykliczne:

Cykliczne kwadraty

Ten trapez nie jest cykliczny.

Trapezoidalny

(Obrazy z Wikipedii)

Cel

Biorąc pod uwagę współrzędne czterech wierzchołków w kolejności przeciwnej do ruchu wskazówek zegara, które tworzą wypukły czworokąt, ustal, czy czworokąt jest cykliczny.

Współrzędne będą liczbami całkowitymi (należy jednak pamiętać, że współrzędne i obwód wokół okręgu niekoniecznie są liczbami całkowitymi.) Jak sugeruje poprzedni akapit, żadne trzy punkty nie będą współliniowe i żadne dwa zbieżne.

I / O

Możesz przyjmować dane wejściowe w dowolnym rozsądnym formacie. W szczególności [[x1,x2,x3,x4],[y1,y2,y3,y4]], [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]i liczby zespolone są w porządku.

Dane wyjściowe przy użyciu różnych spójnych wartości dla true i false.

Przypadki testowe

Prawdziwe:

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

Fałszywy:

[0,0], [314,0], [314,100], [0,99]
[31,41],[59,26],[53,58],[0,314]
lirtosiast
źródło

Odpowiedzi:

11

Wolfram Language (Mathematica) , 23 bajty

#∈Circumsphere@{##2}&

Wypróbuj online!

Trwa cztery wejścia: listach {x1,y1}, {x2,y2}, {x3,y3}, i {x4,y4}. Sprawdza, czy pierwszy punkt leży na obwodzie pozostałych trzech. Działa również w celu sprawdzenia, czy punktów w jest zbieżnych, pod warunkiem, że ostatnie z nich jest afinicznie niezależnych (ponieważ jest to smutne, jeśli dasz mu zdegenerowany wkład).n+1RnnCircumsphere

Alternatywnie, oto podejście matematyczne:

Wolfram Language (Mathematica) , 29 28 25 24 bajtów

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

Wypróbuj online!

Pobiera na wejściu dwie listy: {x1,x2,x3,x4}i {y1,y2,y3,y4}. Zwraca, Indeterminategdy cztery punkty znajdują się na wspólnym kole, i w 1przeciwnym razie.

Z czterech punktów to rozwiązanie konstruuje macierz poniżej:(x1,y1),(x2,y2),(x3,y3),(x4,y4)

[x12+y12x22+y22x32+y32x42+y42x1x2x3x4y1y2y3y41111]

Wyznacznikiem tej macierzy jest 0 wtedy i tylko wtedy, gdy cztery rzędy są liniowo zależne, a liniowa zależność między rzędami jest tym samym, co równanie koła, które jest spełnione we wszystkich czterech punktach.

Najkrótsza droga mogłem pomyśleć, by sprawdzić, czy wyznacznikiem jest 0 jest podniesienie go do 0-tej potęgi: 0^0jest Indeterminatenatomiast coś innego daje 1.

Misza Ławrow
źródło
10

Python 3 , 70 bajtów

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

Wypróbuj online!

Korzystam z twierdzenia Ptolemeusza .

W czworoboku, jeżeli suma iloczynu dwóch par przeciwległych boków jest równa iloczynowi jego przekątnych, wówczas czworobok może być wpisany w okrąg.

b, c, d, eSą liczbami zespolonymi.

Кирилл Малышев
źródło
8

Perl 6 , 44 bajtów

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

Wypróbuj online!

Przyjmuje wierzchołki jako liczby zespolone. Wykorzystuje fakt, że suma przeciwnych kątów wynosi 180 ° w cyklicznym czworoboku. Kolejność operacji powinna gwarantować, że operacje zmiennoprzecinkowe dają dokładny wynik dla (wystarczająco małych) liczb całkowitych.

Rozwiązanie TI-Basic dla portu Miszy Ławrow, 33 bajty

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

Wypróbuj online!

nwellnhof
źródło
42? Czy to nadal jest dokładne?
Jo King
1
@JoKing Nie, to nie jest .
nwellnhof,
Co robi dwukropek w tym przypadku? Zdecydowanie nie jest to etykieta, a także wywołanie metody.
user202729,
@ user202729 Jest to wywołanie metody z pośrednią składnią wywołującą .
nwellnhof,
6

JavaScript (ES6)

Testowanie kątów, 114 bajtów

Pobiera dane wejściowe jako tablicę . Zwraca wartość logiczną.[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

Wypróbuj online!


Obliczanie wyznacznika, 130 bajtów

Pobiera dane wejściowe jako i w składni curry. Zwraca wartość logiczną.[x1,x2,x3,x4][y1,y2,y3,y4]

Ta jest odpowiednikiem drugiej odpowiedzi MishaLavrov z obróconą matrycą.

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

Wypróbuj online!

Arnauld
źródło
6

TI-Basic (seria 83), 21 bajtów

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

Pobiera dane wejściowe jako listę czterech liczb zespolonych w Ans. Zwraca, 1jeśli czworokąt jest cykliczny i 0inaczej.

Jest to obliczenie współczynnika krzyżowego Nwellnhofa , w ciężkim przebraniu. Jeśli zaczniemy od wartości , wówczas:z1,z2,z3,z4

  • ΔList(augment(Ans,Ansoblicza różnice (i kilka innych zbędnych warunków),z2z1,z3z2,z4z3,z1z4
  • e^(ΔList(ln(z tego oblicza się współczynniki .z3z2z2z1,z4z3z3z2,z1z4z4z3,
  • Sprawdzamy, czy iloczyn pierwszych i trzecich warunków, którym jest , nie ma części fikcyjnej. Zauważ, że jest to to samo co współczynnik .z3z2z2z1z1z4z4z3 (z3,z1;z2,z4)=z2-z3 (z3,z1;z2,z4)=z2z3z2z1:z4z3z4z1

Zrobiłem co w mojej mocy, aby sprawdzić, czy błąd numeryczny jest problemem i wydaje się, że tak nie jest, ale jeśli ktoś ma dobre testy, daj mi znać.

Misza Ławrow
źródło
3

JavaScript (ES6) (101 bajtów)

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)

Pobiera dane wejściowe jako [x1,y1,x2,y2,x3,y3,x4,y4], wyświetla wartość logiczną.

Sprawdzane na podstawie gdzie to przekątne, a to boki w kolejności.

ef=ac+bd
e,fa,b,c,d

Wypróbuj online!

Alvin Li
źródło
2

Galaretka , 11 bajtów

²Sṭ;L€€ṖÆḊ¬

Wypróbuj online!

Wykorzystuje wyznacznik z rozwiązania Mathematica Miszy Ławrowa . Wyjścia 1 dla wartości true, 0 dla wartości false.

Jak to działa

²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?

Galaretka , 12 bajtów

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

Wypróbuj online!

Wykorzystuje skomplikowane podejście krzyżowe z rozwiązania TI-Basic Mishy Lavrov . Wyjścia 1 dla wartości true, 0 dla wartości false.

Jak to działa

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?

Uważam, że oboje są golfistami ...

Bubbler
źródło