Biorąc pod uwagę 5 różnych punktów na płaszczyźnie dwuwymiarowej, określ typ przekroju stożkowego utworzonego przez punkty. Wyjście powinno być jednym z circle
, hyperbola
, ellipse
, lub parabola
.
Zasady
- Punkty będą w ogólnej pozycji liniowej, co oznacza, że żadne trzy punkty nie są współliniowe, a zatem przechodzący przez nie stożek będzie unikalny.
- Współrzędne 5 punktów będą liczbami dziesiętnymi od -10 do 10 włącznie.
- Precyzja wartości dziesiętnych / zmiennoprzecinkowych powinna być dokładnością rodzimego typu zmiennoprzecinkowego / dziesiętnego języka. Jeśli Twój język / typ danych to dowolna precyzja, możesz użyć 12 cyfr po przecinku jako maksymalnej wymaganej precyzji, zaokrąglając w kierunku zera (np
1.0000000000005 == 1.000000000000
.). - Kapitalizacja wyniku nie ma znaczenia.
- Wyprowadzanie,
ellipse
gdy sekcja stożkowa jest w rzeczywistości okręgiem, jest niedozwolone. Wszystkie koła są elipsami, ale musisz wyprowadzić najbardziej konkretny.
W przypadku niedokładności i precyzji zmiennoprzecinkowej:
Staram się, aby było to tak proste, jak to możliwe, aby problemy z niedokładnościami zmiennoprzecinkowymi nie przeszkadzały. Celem jest, gdyby typem danych była „magiczna nieskończona wartość precyzji” zamiast liczby zmiennoprzecinkowej / podwójnej, wówczas wszystko działałoby idealnie. Ale ponieważ „magiczna nieskończona wartość precyzji” nie istnieje, piszesz kod, który zakłada, że twoje wartości są nieskończoną precyzją, a wszelkie problemy, które pojawiają się w wyniku niedokładności liczb zmiennoprzecinkowych, są cechami, a nie błędami.
Przypadki testowe
(0, 0), (1, 5), (2, 3), (4, 8), (9, 2) => hyperbola
(1.2, 5.3), (4.1, 5.6), (9.1, 2.5), (0, 1), (4.2, 0) => ellipse
(5, 0), (4, 3), (3, 4), (0, 5), (0, -5) => circle
(1, 0), (0, 1), (2, 1), (3, 4), (4, 9) => parabola
circle
zmiennoprzecinkowych wyjścia wydają się wymagać sprawdzania równości liczb zmiennoprzecinkowych w celu odróżnienia od bardzo okrągłej elipsy. Jaką precyzję powinniśmy tutaj przyjąć?Odpowiedzi:
Matlab, 154 bajtów
Zapisano kilka bajtów dzięki sugestiom Suever.
Pobiera dane wejściowe jako
[x1 y1;x2 y2;x3 y3; etc]
. Wykorzystało to macierz Vandermonde'a i znajduje podstawę jej pustej przestrzeni, która zawsze będzie pojedynczym wektorem. Następnie oblicza dyskryminator i używa go do utworzenia indeksu od 1 do 4, który jest używany do uzyskania ciągu.Nie golfowany:
sign(...)
Część oblicza wyróżnika, dając 1 jeżeli jest dodatnia (hiperboli) -1 gdy ujemny (elipsa), oraz 0, gdy jest 0 (paraboli). Wmax(...)
odejmuje 1 dalej, jeśli jest to koło. Tablice Matlab są indeksowane jednokrotnie, więc dodaj 3, aby podać wartości 1, 2, 3, 4, i użyj tego do indeksowania tablicy nazw sekcji stożkowych.źródło
max() == 0
, możesz uprościć~max()
ones(length(p),1)
ciebie możesz zrobić1+p(:,1)*0
max()
było głupie z mojej strony, miałem tam wcześniej porównania i oczywiście się leniłem! Ten sposób uzyskaniaones
jest również bardzo miły.JavaScript (ES6), 316
323 347Każdy język lepiej dostosowany do obsługi macierzy i wyznacznika powinien uzyskać lepszy wynik (APL, J, CJAM, Jelly)
Odniesienia: Ogólna postać stożka , Pięć punktów określa stożek , Układ równań liniowych , Determinant
W płaszczyźnie kartezjańskiej ogólne równanie stożka jest
mając A, B lub C nie równe 0 (w przeciwnym razie jest to linia prosta)
A ... F to sześć nieznanych do znalezienia. Za pomocą pięciu par (x, y) możemy zbudować układ liniowy z pięcioma równaniami, a skalowanie usunie jeden wymiar. Oznacza to, że możemy ustawić jeden z A, B lub C na 1, jeśli nie jest to 0 (i wiemy, że co najmniej jeden nie jest równy 0).
Buduję i próbuję rozwiązać 3 systemy: najpierw próbuję A = 1. Jeśli nie jest możliwe do rozwiązania, to B = 1, a następnie C. (Może być lepszy sposób, ale to jest mój najlepszy w tym czasie)
Mając wartości A, B, C, możemy sklasyfikować stożkowy patrząc na dyskryminatora
d=B*B-4*A*C
Mniej golfa
Test
źródło
Python - 234 bajty
Nigdy wydrukować
circle
lubparabola
dlatego,t
id[1]
nigdy dokładnie uderzyć0
, ale PO powiedział, że było w porządku.źródło
C 500
Moja odpowiedź JavaScript została przeniesiona do C. Aby sprawdzić, czy da się to zrobić.
Zastosowanie: odczyt 10 wartości ze standardowego wejścia
Wynik:
Test (ideone)
Mniej golfa
źródło
Sage, 247 bajtów
Wypróbuj online
Funkcja ta przyjmuje postać iterowalny z
(x,y)
parami wejścia próbuje obliczania wyróżnika każdej z 3 możliwych układów liniowych (A=1
,B=1
iC=1
), i przekazuje typ części stożkowej w oparciu o wartości wyróżnika,A
,B
, iC
.Prawdopodobnie jest jeszcze trochę do gry w golfa, ale teraz jestem zardzewiały z Sage i śpię, więc popracuję nad tym rano.
źródło