Klasyfikuj Quadrilaterals | Pomóż mi z moim egzaminem z matematyki!

20

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

HyperNeutrino
źródło
1
Mogę być w stanie pomóc z problemem marży xkcd.com/1381
Rohan Jhunjhunwala
@RohanJhunjhunwala Jestem nowym Fermatem (myślę, że to właściwa osoba?). Ale niezły XKCD ref: P
HyperNeutrino
czy wejście CSV jest dozwolone?
tuskiomi
Jaki jest częściowy porządek specyficzności?
Peter Taylor
Powiązane
Cyfrowa trauma

Odpowiedzi:

6

APL (Dyalog) , 104 89 80 82 81 79 78 bajtów

⍙←{⍵⍺⍺1⌽⍵}
⎕←(|x){⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}2|1+-⍙(12x←-⍙⎕+.×1 0J1)÷○1

Wypróbuj online!


Wejście wyjście

Pobiera na wejściu macierz współrzędnych 4 × 2

Wyjścia

  • 1 1 1 dla Square
  • 1 1 0 dla rombu
  • 1 0 1 dla prostokąta
  • 1 0 0 dla równoległoboku
  • 1 0 dla latawca
  • 0 1 na trapez
  • 0 0 dla czworoboku

Algorytm

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

+--------+----------------+----------------+
|        |       AA       |      ~AA       |
+--------+----------------+----------------+
|   AS   |     Square     |    Rhombus     |
|--------+----------------+----------------+
|  ~AS   |    Rectangle   |  Parallelogram |
+--------+----------------+----------------+

Jeśli nie OA, to:

  • Sprawdź, czy są dokładnie 2 pary równych sąsiadujących boków i czy są one rozdzielone ( aabbzamiast aaab). 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. Obraca ( 1⌽) argument ( )
  2. Zastosuj ⍺⍺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 4jest to, 1 2 3 4 + 2 3 4 1co ocenia 3 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ściowe

  • 1 0J1reprezentuje wektor [1, i] („wektor” w sensie matematycznym, a „i” jako pierwiastek kwadratowy z -1). W APL a+bizapisywana 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 zmiennej x


2|1+-⍙(12○x)÷○1 znajduje (przedstawienie) kątów zewnętrznych na 4 wierzchołkach kształtu.

  • 12○xznajduje główny argument w radianach każdego z 4 wektorów bocznych.

  • ÷○1dzieli 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ć.


|xznajduje 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 .

  • Funkcja ma strzeżone wyrażenie. W tym przypadku ⍵≡2⌽⍵jest strażnikiem.
  • Jeśli wartownik ocenia 1to, następne wyrażenie ≡⍙¨0⍺⍵jest wykonywane i zwracana jest jego wartość.
  • Jeśli wartownik oceni to 0, to wyrażenie zostanie pominięte, a następne 2 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 skalara 0, 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 ≡⍙0wraca 1. 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óch 1lub -1w 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ę do 1lub 3. 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ą 1lub 3.

  • 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 z 1s, 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ą tylko 0s i 1s), jedynymi możliwymi wartościami sumy par są 0: 1i 2. Tak 1=2|samo jak tylko 1=.

  • +/sumuje tablicę. Daje to liczbę par, która jest 1.

  • 4=sprawdź, czy równa się 4. Jedyny sposób, który się wydarzy, to jeśli (=⍙⍺)jest 1 0 1 0lub 0 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.

TwiNight
źródło
3

Mathematica, 195 bajtów

Which[s=Differences@{##,#};l=Norm/@s;r=#.#2==#2.#3==0&@@s;Equal@@l,If[r,1,2],#==#3&&#2==#4&@@l,If[r,3,4],MatchQ[l,{a_,b_,b_,a_}|{a_,a_,b_,b_}],5,#+#3=={0,0}||#2+#4=={0,0}&@@Normalize/@s,6,1>0,7]&

Z białymi znakami:

Which[
    s = Differences @ {##,#};
    l = Norm /@ s;
    r = #.#2 == #2.#3 == 0& @@ s;

    Equal @@ l, If[r, 1, 2],
    # == #3 && #2 == #4& @@ l, If[r, 3, 4],
    MatchQ[l, {a_,b_,b_,a_}|{a_,a_,b_,b_}], 5,
    #+#3 == {0,0} || #2+#4 == {0,0}& @@ Normalize /@ s, 6,
    1 > 0, 7
]&

Wyjścia 1dla kwadratów, 2romboidów, 3prostokątów, 4równoległoboków, 5latawców, 6trapezów i 7wszystkiego innego. Zamieściłbym link TIO, ale najwyraźniej to nie działa w matematyce.

Jeżeli cztery punkty są P, Q, Ri S, to {##,#}jest {P,Q,R,S,P}, więc slista wektorów bocznych {Q-P,R-Q,S-R,P-S}, ljest długość tych wektorów, i rjest warunek, że kąt między Q-Pa R-Q, jak również kąt między R-Qi S-Rsą zarówno 90stopni.

Tak więc, jeśli wszystkie długości boków są równe, to czworobok jest rombem. Jeśli się rtrzyma, 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ę rtrzyma, 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 ljest postaci {a,b,b,a}lub {a,a,b,b}dla niektórych ai b, 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, Normalizewprowadzają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.

ngenisis
źródło
1

Python 2 , 463 410 408 397 bajtów

Zaoszczę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:

  1. Plac
  2. Prostokąt
  3. Romb
  4. Równoległobok
  5. Trapezoidalny
  6. Latawiec
  7. Czworoboczny
from numpy import *;D=dot
from numpy.linalg import *;N=norm
def P(a,b):x=D(a,b);y=N(a)*N(b);return x==y or x==-y
def Q(a,b):return int(N(a)==N(b))
L=input()
a,b,c,d=tuple([(L[i][0]-L[(i+1)%4][0],L[i][1]-L[(i+1)%4][1]) for i in range(4)])
g=7
e=Q(a,c)+Q(b,d)
if e==2:
 g=(1if D(a,b)==0 else 3) if Q(a,b) else 2 if D(a,b)==0 else 4
elif P(a,c) or P(b,d):
 g = 5
elif Q(a,b) or Q(b,c):
 g = 6
print g

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.

def S(va, vb):
    return (va[0]-vb[0], va[1]-vb[1])
def dot(sa,sb):      # Eventually replaced with numpy.dot
    return(sa[0]*sb[0]+sa[1]*sb[1])
def norm(s):         # Eventually replaced by numpy.linalg.norm
    return (s[0]**2+s[1]**2)**.5
def isperp(a,b):     # Test if lines/vectors are perpendicular
    return dot(a,b)==0
def ispar(a,b):      # Test if lines/vectors are parallel
    x = dot(a,b)
    y = norm(a)*norm(b)
    return x == y or x == -y
def iseq(a,b):       # Test if lines/vectors are equal in length
    return norm(a)==norm(b)
   
def f(L):
    #Define the four sides
    s = []
    for i in range(4):
        s.append(S(L[i],L[(i+1)%4]))  # I refer often so shorter names may eventually

    guess = 'Q'
    eqsides = 0           # These 6 lines eventually golfed using integer arithmetic by returning an int from iseq()
    if iseq(s[0], s[2]):
        eqsides += 1
    if iseq(s[1],s[3]):
        eqsides += 1
    if eqsides == 2:
    # Opposite sides are equal, so square, rhombus, rectangle or parallelogram
        if iseq(s[0],s[1]):       #Equal adjacent sides, so square or rhombus
            guess='S' if isperp(s[0], s[1]) else 'H'
        else:                     # rectangle or Parallelogram
            guess='R' if isperp(s[0], s[1]) else 'P'
    elif ispar(s[0],s[2]) or ispar(s[1],s[3]):
        guess = 'T'
    elif iseq(s[0],s[1]) or iseq(s[1],s[2]):
        guess = 'K'
    return guess
    

#test suite:
print f([(0, 0), (1, 0), (1, 1), (0, 1)]) # -> square
print f([(0, 0), (1, 1), (-1, 3), (-2, 2)]) # -> rectangle
print f([(0, 0), (5, 0), (8, 4), (3, 4)]) #  -> rhombus
print f([(0, 0), (5, 0), (6, 1), (1, 1)]) #  -> parallelogram
print f([(0, 0), (4, 0), (3, 1), (1, 1)]) # -> trapezoid/trapezium
print f([(0, 0), (1, 1), (0, 3), (-1, 1)]) #-> kite  
print f([(0, 0), (2, 0), (4, 4), (0, 1)]) #-> quadrilateral

Wypróbuj online!

CCB60
źródło
1
Inne klasyfikowane [(0, 0), (2, 2), (4, 0), (0,-2)]jako latawiec
TwiNight
Czy to zadziała? repl.it/JRzE
Zacharý
@TwiNight Thanks. Nie widziałem tej możliwości. Problem polega na tym, że mój początkowy algorytm sprawdza tylko, czy JEDNA para boków ma dopasowaną długość. Jak pokazuje przykład, to nie wystarczy. Musiałbym sprawdzić jedną parę dopasowanych boków, a następnie sprawdzić, czy przeciwna para ma również podobną długość. Byłem zbyt zajęty, aby to wdrożyć.
CCB60
0

Partia, 287 bajtów

@set/aa=%3-%1,b=%4-%2,c=%5-%1,d=%6-%2,e=%7-%1,f=%8-%2,g=a*a+b*b,h=(h=c-a)*h+(h=d-b)*h,i=(i=c-e)*i+(i=d-f)*i,j=e*e+f*f,p=!(i-g)+!(j-h),q=!(h-g),r=!(a*e+b*f),k=q+!(j-i)^|!(j-g)+!(h-i),t=!(a*(f-d)-b*(e-c))+!((c-a)*f-(d-b)*e)
@if %p%==2 (echo 1%r%%q%)else if %k%==2 (echo 1)else (echo 1%t%)

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, jsą kwadratami długości boków. pto liczba par przeciwległych boków o tej samej długości, qrozróżnia równoległoboki / prostokąty i rhobmi / kwadraty, sprawdzając, czy przeciwne pary są w rzeczywistości równe, rrozróżnia równoległoboki / romby i prostokąty / kwadraty za pomocą kontroli prostopadłości, ksprawdza , czy latawiec, szukając pary równych sąsiadujących boków i tsprawdza trapez poprzez kilka równoległych czeków bocznych.

Neil
źródło
Zobacz ten komentarz
TwiNight
@TwiNight Bah, sprawdzanie latawca jest naprawdę niezręczne.
Neil
Tak, miałem szczęście znaleźć kompaktowy sposób na zrobienie tego
TwiNight
@TwiNight Uwierzę ci na słowo; APL jest dla mnie całkowicie nieczytelny.
Neil
Część, w której sprawdzam latawiec, to 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
TwiNight