From http://en.wikipedia.org/wiki/Triangle :
Napisz program, który pobiera trzy krotki współrzędnych 2d (kartezjański) i klasyfikuje, jaki kształt opisują te trzy punkty.
W prawie wszystkich przypadkach punkty te opisują trójkąt różnych typów. W niektórych zdegenerowanych przypadkach punkty będą opisywać pojedynczy punkt lub linię prostą. Program określi, które z następujących znaczników dotyczą opisanego kształtu:
- Punkt (3 punkty to incydent)
- Linia (3 punkty leżą na linii prostej - nie więcej niż 2 punkty mogą być współwystępujące)
- Równoległe (3 strony równe, 3 kąty równe)
- Równoramienne (2 strony równe, 2 kąty równe)
- Skalen (0 boków równych, 0 kątów równych)
- W prawo (1 kąt dokładnie π / 2 (lub 90 °))
- Ukośne (0 kątów dokładnie π / 2 (lub 90 °))
- Tępy (1 kąt> π / 2 (lub 90 °))
- Ostre (3 kąty <π / 2 (lub 90 °))
Pamiętaj, że w przypadku niektórych opisanych kształtów zastosowanie będzie mieć więcej niż jeden z powyższych znaczników. Na przykład każdy kąt prosty będzie albo równoramienny, albo skalenowy.
Wkład
- Program może odczytać 3 współrzędne wejściowe ze STDIN, wiersza poleceń, zmiennych środowiskowych lub dowolnej innej metody dogodnej dla wybranego języka.
- Współrzędne wejściowe mogą być sformatowane, ale jest to wygodne dla wybranego języka. Można założyć, że wszystkie liczby wejściowe są dobrze uformowane w odniesieniu do typów danych, z których ostatecznie korzystasz.
- Nic nie można założyć o uporządkowaniu współrzędnych wejściowych.
Wydajność
- Program wyświetli STDOUT, okno dialogowe lub dowolną metodę wyświetlania dogodną dla wybranego języka.
- Wyjście wyświetli wszystkie znaczniki mające zastosowanie do kształtu opisanego przez współrzędne wejściowe.
- Tagi mogą być wyprowadzane w dowolnej kolejności.
Inne zasady
- Dopuszczalne są trygonometryczne biblioteki / interfejsy API w Twoim języku, ale wszelkie interfejsy API, które specjalnie obliczają typy trójkątów, są zakazane.
- Przy określaniu równości kątów lub długości boków prawdopodobnie skończysz na porównywaniu wartości zmiennoprzecinkowych. Dwie takie wartości należy uznać za „równe”, jeśli jedna mieści się w granicach 1% drugiej.
- Standardowe „luki”, które nie są już śmieszne
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Przykłady
Input Output
(1,2) (1,2) (1,2) Point
(1,2) (3,4) (5,6) Line
(0,0) (1,1) (2,0) Isosceles Right
(0,0) (2,1) (10,1) Scalene Oblique Obtuse
Odpowiedzi:
C (451 bajtów)
Używa tylko kwadratowych długości i nachyleń.
Niegolfowany (i operator trójskładnikowy zastąpiony przez if / else):
Format wejściowy (poprzez standardowe wejście): xyxyxy
dawny. 0 0 1 1 2 0 dla Isosceles Right
źródło
./triangle <<< "1 2 1 2 1 2"
Należy używać @digitaltrauma , wraz z cytatami.C 333
Na chwilę zostawiłem spację. To działa, ale prawdopodobnie przydałoby się trochę porządkowania i gry w golfa. Podobna matematyka do
@es1024
odpowiedzi, ale wykorzystuje pętlę i tablice. Format wejściowyx y x y x y
Zmienne
t[]
przechowuje zarówno dane wejściowe, jak i kwadraty długości. Pod koniec programu wygląda to tak, jak w poniższej tabeli (zwiększenie liczby iteracji pętli doprowadziłoby do nieokreślonego powtarzania kwadratowych długości). Na początku pętli kwadraty długości (śmieci, ponieważ nie wszystkie dane są dostępne ) niepotrzebnie przechowywane w komórkach 1,3 i 5, ale są szybko zastępowane przezscanf.
wartościowe dane są zapisywane doz,b,c
AHDs
gdyi
= 9,11,13 (t[i]
it[i-2]
są dostępne).g[]
dodano późno, aby zachować wartości dx i dy potrzebne do obliczenia nachylenia. Jedyne użyte komórki to 6 do 9 (0 do 5 są niewiarygodne, ponieważ nie wszystkie dane są dostępne, gdy są zapisane). Jeślig[6]/g[7]==g[8]/g[9]
nachylenia 2 linii są równe, a trójkąt jest tylko linią (lub punktem). Równanie jest zmieniany w programie, aby uniknąć podziału.r
jest wartością pośrednią stosowaną do kwadratuz
zlicza liczbę boków o długości zero. Ma przesunięcie +3, ponieważ pętla odczytuje 3 puste komórkit[]
.c
liczy liczbę boków o identycznej długości. Ma również przesunięcie +3. Zauważ, że stronaa
jest napisanat[]
dwa razy, aby móc sprawdzić a = b, b = c, c = a.b
to największa długość boku, kwadrat.s
jest sumą kwadratów wszystkich stron.Zauważ, że porównanie długości boku A ^ 2 + B ^ 2 + C ^ 2 z 2 * B ^ 2 jest takie samo jak porównanie A ^ 2 + C ^ 2 z B ^ 2 (wystarczy odjąć B ^ 2 z obu stron.) jeśli B ^ 2 = A ^ 2 + C ^ 2, jest to trójkąt prostokątny. jeśli B ^ 2 jest większy, jest tępy, jeśli mniejszy, jest ostry.
źródło
Golfscript (175 bytes)
Możesz to przetestować tutaj (zestaw testowy w zestawie).
Format wejściowy:
Skomentowana wersja:
UWAGA:
Mój kod nie zawiera danych wyjściowych „równoważnych”, ponieważ:
źródło
Mathematica (
313307 znaków)Gra w golfa:
Nie golfowany:
Format wejściowy to lista punktów, w których wywoływana jest funkcja:
źródło