Wsparcie! Mój egzamin z matematyki już niedługo, a ja się nie uczyłem! 1 Część egzaminu polega na sklasyfikowaniu czworoboku ze względu na jego współrzędne wierzchołka, co niestety nie wiem jak to zrobić. 2)
Zatem twoim wyzwaniem jest napisanie programu, który zrobi to za mnie, więc nie zawiodę!
Wyzwanie
Biorąc pod uwagę cztery wierzchołki, tak że żadne trzy z nich nie są kolinearne, określ najbardziej szczegółową klasyfikację czworoboku utworzonego przez te cztery wierzchołki.
Rozumiem przez „najbardziej szczegółową klasyfikację”, że chociaż wszystkie kwadraty są prostokątami, jeśli kształt jest kwadratem, należy wskazać, że jest kwadratem, a nie wskazać, że jest prostokątem.
Wejście
Dane wejściowe będą podawane jako cztery współrzędne (x, y). Możesz wziąć je jako listę długości 4 list / krotek o długości 2. Alternatywnie, możesz wziąć dane wejściowe jako listę współrzędnych x i listę odpowiednich współrzędnych y.
Na przykład, jeśli mój kształt ma wierzchołki w punktach (0, 0)
, (5, 0)
, (6, 1)
, i (1, 1)
, można zdecydować się na wejście w jednym z następujących formatów lub coś podobnego:
[(0, 0), (5, 0), (6, 1), (1, 1)]
([0, 5, 6, 1], [0, 0, 1, 1])
Możesz założyć, że czworobok nie przecina się sam, i że punkty są podane we właściwej kolejności (to znaczy dwa kolejne punkty na wejściu zostaną połączone segmentem linii w czworoboku).
Wynik
Będziesz potrzebował unikalnego wyjścia dla każdej z następujących klas czworokąta:
- Plac
- Prostokąt
- Romb
- Równoległobok
- Trapez / Trapez
- Latawiec
- Czworoboczny
Może to być sama nazwa, znak, liczba całkowita itp.
Zasady
- Obowiązują standardowe luki
- Jeśli Twój język programowania ma wbudowaną funkcję, która wykona dokładnie to zadanie, ta wbudowana funkcja jest niedozwolona.
- Dozwolone są wbudowane funkcje wyszukiwania odległości między dwoma punktami.
- Dozwolone są wbudowane funkcje wyszukiwania kąta między dwiema liniami.
W tym momencie, jeśli znasz wszystkie warunki, jesteś gotowy, aby rozpocząć programowanie! (Przypadki testowe są na końcu)
Terminologia
Ta sekcja jest przeznaczona dla każdego, kto potrzebuje wyjaśnień na temat definicji różnych kształtów.
Plac
Czworokąt jest kwadratem wtedy i tylko wtedy, gdy wszystkie 4 jego boki mają równą długość, a każda para sąsiednich boków jest prostopadła (to znaczy zarówno prostokąt, jak i romb).
Prostokąt
Czworokąt jest prostokątem tylko wtedy, gdy każda para sąsiednich boków jest prostopadła.
Romb
Czworokąt jest rombem tylko wtedy, gdy wszystkie 4 jego boki są równe.
Równoległobok
Czworokąt jest równoległobokiem wtedy i tylko wtedy, gdy każda para przeciwnych boków jest równoległa, a każda para przeciwnych kątów jest równa. Oba te warunki sugerują się nawzajem, więc musisz tylko sprawdzić jeden z nich.
Trapez / Trapez
Czworobok jest trapezem / trapezem tylko wtedy, gdy ma co najmniej jedną parę równoległych boków.
Latawiec
Czworobok jest latawcem, jeśli dwie przeciwległe pary sąsiednich boków są równej długości; to znaczy, dwa sąsiednie boki są równe, a pozostałe dwa są równe.
Przypadki testowe
input as (x, y) * 4 -> full name
[(0, 0), (1, 0), (1, 1), (0, 1)] -> square
[(0, 0), (1, 1), (-1, 3), (-2, 2)] -> rectangle
[(0, 0), (5, 0), (8, 4), (3, 4)] -> rhombus
[(0, 0), (5, 0), (6, 1), (1, 1)] -> parallelogram
[(0, 0), (4, 0), (3, 1), (1, 1)] -> trapezoid/trapezium
[(0, 0), (1, 1), (0, 3), (-1, 1)] -> kite
[(0, 0), (2, 0), (4, 4), (0, 1)] -> quadrilateral
Linki (Kalkulator graficzny Desmos)
Oto linki do wizualizacji każdego z przypadków testowych.
Kwadratowy
prostokąt
Romb
równoległobok
Trapez /
latawiec trapezowy
Czworoboczny
Zwycięskie kryteria
Oczywiście nie mogę wziąć udziału w egzaminie, więc musisz napisać możliwie najkrótszy kod, aby móc go zapamiętać. Muszę zapisać go na marginesach i uruchomić za pomocą TryItOffline TM , aby dopasować go do marginesów, twój program musi być tak mały, jak to możliwe!
1 Oczywiście, że tak: P
2 Oczywiście, że tak: P
Odpowiedzi:
APL (Dyalog) ,
104898082817978 bajtówWypróbuj online!
Wejście wyjście
Pobiera na wejściu macierz współrzędnych 4 × 2
Wyjścia
1 1 1
dla Square1 1 0
dla rombu1 0 1
dla prostokąta1 0 0
dla równoległoboku1 0
dla latawca0 1
na trapez0 0
dla czworobokuAlgorytm
Najpierw znajdź wszystkie 4 długości i kąty czworoboku
Jeśli obie pary przeciwnych kątów są równe (
OA
), wówczas kształt jest rodzajem równoległoboku. Ustal, czy wszystkie długości boków są równe (AS
, przylegające strony) i czy wszystkie kąty są równe (AA
).Jeśli nie
OA
, to:Sprawdź, czy są dokładnie 2 pary równych sąsiadujących boków i czy są one rozdzielone (
aabb
zamiastaaab
). Jeśli tak, to kształt latawca.Ustal, czy dokładnie jest 1 para równoległych przeciwnych boków. Jeśli tak, to kształt jest trapezem.
W przeciwnym razie kształt jest czworokątny.
Kod
⍙←{⍵⍺⍺1⌽⍵}
definiuje nowego operatora. W APL operator oznacza funkcję wyższego rzędu . Ten operator pobiera 1 argument funkcyjny (⍺⍺
) i zwraca funkcję monadyczną, która:1⌽
) argument (⍵
)⍺⍺
między nim a⍵
Jest to szczególnie przydatne w przypadku funkcji skalarnych, ponieważ większość z nich niejawnie odwzorowuje argumenty tablicowe, umożliwiając
⍙
zastosowanie tych między każdą sąsiednią parą elementów z zawijaniem. Na przykład+⍙1 2 3 4
jest to,1 2 3 4 + 2 3 4 1
co ocenia3 5 7 5
.x←-⍙⎕+.×1 0J1
konwertuje wejściową macierz współrzędnych na tablicę liczb zespolonych reprezentujących wektory 4 stron kształtu.⎕
, przywołanie, pobiera i zwraca dane wejściowe1 0J1
reprezentuje wektor [1, i] („wektor” w sensie matematycznym, a „i” jako pierwiastek kwadratowy z -1). W APLa+bi
zapisywana jest liczba zespolonaaJb
+.×
mnożenie macierzy. Matematycznie wynikiem byłaby macierz 4 × 1. Jednak+.×
w APL nazywa się go „produktem wewnętrznym”, który uogólnia mnożenie macierzy i wektor produktu wewnętrznego i pozwala robić nawet takie rzeczy, jak „pomnożenie” macierzy 3-wymiarowej przez macierz 2-wymiarową. W tym przypadku mnożymy macierz 4 × 2 i wektor 2-elementowy, co daje wektor 4-elementowy (reprezentacji liczb zespolonych 4 podanych wierzchołków).-⍙
to odejmowanie parami z zawijaniem, jak wspomniano powyżej. Daje to wektory 4 stron kształtu (jako liczby zespolone). Wektory te wskazują kierunek „odwrotny”, ale to nie ma znaczenia.x←
przechowuje to w zmiennejx
2|1+-⍙(12○x)÷○1
znajduje (przedstawienie) kątów zewnętrznych na 4 wierzchołkach kształtu.12○x
znajduje główny argument w radianach każdego z 4 wektorów bocznych.÷○1
dzieli przez π, dzięki czemu kąty są łatwiejsze do pracy. Zatem wszystkie kąty są wyrażone jako wielokrotność kąta prostego.-⍙
Odejmowanie parami z zawijaniem, jak wspomniano powyżej. To daje 4 kąty zewnętrzne.2|1+
Główny argument jest ograniczony (-1,1], a odejmowanie parami powoduje, że zakres (-2,2]. Jest to złe, ponieważ ten sam kąt ma 2 różne reprezentacje. Wykonując „dodaj 1 mod 2”, kąt jest ponownie ograniczone do (0,2]. Chociaż wszystkie kąty są o 1 większe niż powinny być, dobrze jest, jeśli będziemy o tym pamiętać.|x
znajduje wielkość każdego z 4 wektorów bocznych{⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}
definiuje i stosuje funkcję z tablicą 4 kątów zewnętrznych jako prawym argumentem⍵
i tablicą 4 długości boków jako prawym argumentem⍺
.⍵≡2⌽⍵
jest strażnikiem.1
to, następne wyrażenie≡⍙¨0⍺⍵
jest wykonywane i zwracana jest jego wartość.0
, to wyrażenie zostanie pominięte, a następne2 4=...=⍙⍺)
zostanie wykonane zamiast tego.⍵≡2⌽⍵
sprawdza, czy obie pary przeciwnych kątów są równe.2⌽⍵
obraca tablicę kątów o 2 miejsca.⍵≡
sprawdza, czy to samo jak ona⍵
sama≡⍙¨0⍺⍵
zwraca unikalną wartość dla każdego kształtu typu równoległoboku.0⍺⍵
to 3-elementowa tablica skalara0
, tablica długości bocznych⍺
i tablica kątów⍵
.≡⍙¨
wykonuje≡⍙
dla każdego z tych elementów.≡⍙
sprawdza, czy wszystkie wartości tablicy są równe, sprawdzając, czy obrócenie jej o 1 daje tę samą tablicę. Skalary nie obracają się, więc≡⍙0
wraca1
. Jak wspomniano powyżej,≡⍙⍺
sprawdza romb i≡⍙⍵
sprawdza prostokąt.2 4=+/1=2|+⍙↑⍵(=⍙⍺)
zwraca unikalną wartość dla każdego kształtu innego niż równoległobok. Osiąga się to poprzez przeplatanie kontroli latawca i trapezu.2=+/1=2|+⍙⍵
sprawdza trapez.+⍙⍵
daje sąsiednie sumy kątów. Kąty wewnętrzne linii równoległych sumują się do kąta prostego, podobnie jak kąty zewnętrzne równoległych boków czworoboku. Tak więc każda para równoległych boków powinna prowadzić do dwóch1
lub-1
w sąsiednich sumach kątów.1=2|
Jednak kąty w⍵
są o 1 większe niż powinny być, więc kąty faktycznie sumują się do1
lub3
. Można to sprawdzić za pomocą „mod 2 równa się 1”.+/
sumuje tablicę. Daje to liczbę sąsiednich sum kątów, które są1
lub3
.2=
sprawdź, czy jest to równe 2. (Tj., czy jest dokładnie jedna para równoległych boków)4=+/1=2|+⍙(=⍙⍺)
sprawdza latawiec.(=⍙⍺)
daje tablicę wskazującą, które sąsiednie boki są równe. W przeciwieństwie≡
,=
element mądry pracy. Tak więc jest to 4-elementowa tablica z1
s, gdzie długość tego boku jest równa długości „następnego” boku.+⍙
Suma parowania z zawijaniem.1=2|
Ponieważ(=⍙⍺)
daje tablicę boolowską (jedną zawierającą tylko0
s i1
s), jedynymi możliwymi wartościami sumy par są0
:1
i2
. Tak1=2|
samo jak tylko1=
.+/
sumuje tablicę. Daje to liczbę par, która jest1
.4=
sprawdź, czy równa się 4. Jedyny sposób, który się wydarzy, to jeśli(=⍙⍺)
jest1 0 1 0
lub0 1 0 1
. Jak wspomniano powyżej, oznacza to, że kształt jest latawcem.2 4=+/1=2|+⍙↑⍵(=⍙⍺)
przeplata powyższe kontrole.⍵(=⍙⍺)
jest 2-elementową zagnieżdżoną tablicą tablicy⍵
i tablicy(=⍙⍺)
↑
promuje zagnieżdżoną tablicę do odpowiedniej macierzy. Ponieważ⍵(=⍙⍺)
jest to 2-elementowa tablica 4-elementowych tablic, wynikiem jest macierz 2 × 4.+⍙
Ponieważ⌽
(i przez rozszerzenie⍙
) obraca ostatnią oś (poziomą),+⍙
do macierzy jest to samo, co zastosowanie+⍙
do każdego rzędu osobno.1=2|
zarówno resid / mod (|
), jak i equals (=
) działa na zasadzie dla elementu, nawet na macierzach.+/
Domyślnie redukcja (/
) działa wzdłuż ostatniej (poziomej) osi.+/
Sumuje więc rzędy i zamienia macierz 2 × 4 w prostą 2-elementową tablicę.2 4=
Ponieważ=
działa na element, sprawdza to jednocześnie warunki latawca i trapezu.źródło
Mathematica, 195 bajtów
Z białymi znakami:
Wyjścia
1
dla kwadratów,2
romboidów,3
prostokątów,4
równoległoboków,5
latawców,6
trapezów i7
wszystkiego innego. Zamieściłbym link TIO, ale najwyraźniej to nie działa w matematyce.Jeżeli cztery punkty są
P
,Q
,R
iS
, to{##,#}
jest{P,Q,R,S,P}
, więcs
lista wektorów bocznych{Q-P,R-Q,S-R,P-S}
,l
jest długość tych wektorów, ir
jest warunek, że kąt międzyQ-P
aR-Q
, jak również kąt międzyR-Q
iS-R
są zarówno90
stopni.Tak więc, jeśli wszystkie długości boków są równe, to czworobok jest rombem. Jeśli się
r
trzyma, to w rzeczywistości jest kwadratem, w przeciwnym razie jest to zwykły romb.Wykluczając romby, jeśli obie pary przeciwnych długości boków są równe, wówczas czworokąt jest nadal równoległobokiem. Jeśli się
r
trzyma, to w rzeczywistości jest prostokątem, w przeciwnym razie jest to zwykły równoległobok.Wykluczając równoległoboki, lista niepożądanych długościach
l
jest postaci{a,b,b,a}
lub{a,a,b,b}
dla niektórycha
ib
, następnie w kształcie czworoboku jest latawiec. Zauważ, że nie może to być dodatkowo trapezoid, w rzeczywistości byłby to romb.Wykluczając równoległoboki i latawce, jeśli czworokąt ma parę równoległych boków, jest to trapez. Sprawdzamy to,
Normalize
wprowadzając wektory boczne i sprawdzając, czy para przeciwnych wektorów dodaje się do{0,0}
.Wykluczając wszystkie powyższe, jeśli
1 > 0
(lepiej), to czworobok jest zwykłym starym czworobokiem.źródło
Python 2 ,
463410408397 bajtówZaoszczędzono 53 bajty, używając krotki w szóstej linii zamiast indeksowania do listy.
Zaoszczędzono 11 bajtów, przesuwając do liczb całkowitych od 1 do 7 zamiast pierwszej litery każdego kształtu. Liczby całkowite odpowiadają następująco:
Wypróbuj online!
Nie golfił, aby pokazać logikę
Pokazany jako funkcja, aby wyświetlić dane wyjściowe dla różnych danych wejściowych testu. Uwaga Zmieniłem przykład testu „Prostokąt” z pierwotnie podanego w pytaniu, który nie był prostokątem.
Logika opiera się na iloczynach kropkowych i normie (długości) wektorów utworzonych przez boki czworoboku, aby ocenić, czy boki są równej długości, równoległe po przeciwnych stronach lub prostopadłe do sąsiednich boków.
Wypróbuj online!
źródło
[(0, 0), (2, 2), (4, 0), (0,-2)]
jako latawiecPartia, 287 bajtów
Wyjścia binarne:
1
= latawiec,10
= czworokąt,11
= trapez,100
= równoległobok,101
= romb,110
= prostokąt,111
= kwadrat. Objaśnienie:g, h, i, j
są kwadratami długości boków.p
to liczba par przeciwległych boków o tej samej długości,q
rozróżnia równoległoboki / prostokąty i rhobmi / kwadraty, sprawdzając, czy przeciwne pary są w rzeczywistości równe,r
rozróżnia równoległoboki / romby i prostokąty / kwadraty za pomocą kontroli prostopadłości,k
sprawdza , czy latawiec, szukając pary równych sąsiadujących boków it
sprawdza trapez poprzez kilka równoległych czeków bocznych.źródło
2=|-.=⍙⍺
. Z pewnością wygląda na zwarty, jeśli zignorujesz pracę włożoną w obliczenia⍺
(4 długości boczne) i całą linię do zdefiniowania⍙