Napisz funkcję, która pobiera 4 punkty na płaszczyźnie jako dane wejściowe i zwraca true, jeśli 4 punkty tworzą kwadrat. Punkty będą miały współrzędne całkowite o wartościach bezwzględnych <1000.
Jako danych wejściowych możesz wykorzystać dowolną rozsądną reprezentację 4 punktów. Punkty nie są podane w żadnej określonej kolejności.
Najkrótszy kod wygrywa.
Przykładowe kwadraty:
(0,0),(0,1),(1,1),(1,0) # standard square
(0,0),(2,1),(3,-1),(1,-2) # non-axis-aligned square
(0,0),(1,1),(0,1),(1,0) # different order
Przykładowe kwadraty:
(0,0),(0,2),(3,2),(3,0) # rectangle
(0,0),(3,4),(8,4),(5,0) # rhombus
(0,0),(0,0),(1,1),(0,0) # only 2 distinct points
(0,0),(0,0),(1,0),(0,1) # only 3 distinct points
Możesz zwrócić wartość true lub false dla zdegenerowanego kwadratu (0,0),(0,0),(0,0),(0,0)
Odpowiedzi:
Python
1769079 bajtówFunkcja S przyjmuje listę liczb zespolonych jako swoje dane wejściowe (A). Jeśli znamy zarówno środek, jak i jeden narożnik kwadratu, możemy go zrekonstruować, obracając narożnik o 90,180 i 270 stopni wokół punktu środkowego (c). Na płaszczyźnie złożonej obrót o 90 stopni wokół punktu początkowego odbywa się przez pomnożenie punktu przez i . Jeśli nasz pierwotny kształt i zrekonstruowany kwadrat mają te same punkty, to musiał to być kwadrat.
źródło
J, 28
172527J tak naprawdę nie ma funkcji, ale oto czasownik monadyczny, który pobiera wektor punktów ze złożonej płaszczyzny:
Metoda jest mieszanką Michaela Spencera (działa wyłącznie na długościach między wierzchołkami; ale obecnie zawodzi mój romb2) i działa Eelvex (sprawdź rozmiary zestawów). Czytanie od prawej do lewej:
-/~
oblicz wszystkie różnice punktowe,
spłaszczyć|
wyciągnij wielkość/:~
Uporządkuj#/.~
pocałować i policzyć4 8 4 -:
muszą mieć dokładnie 4 jednakowe odległości (przy 0), 8 nieco większe (długość 1, boki), jeszcze 4 większe (długośćsqrt 2
, przekątne)Demonstracja:
Ze względu na pamięć moja poprzednia metoda (wymagała uporządkowanych wierzchołków, ale mogła wykryć regularne wielokąty dowolnego rzędu):
Zobacz historię dla wyjaśnienia i wersji demonstracyjnej. Obecną metodę można by prawdopodobnie rozszerzyć na inne wielokąty, co
4 8 4
wygląda bardzo podobnie do rozkładu dwumianowego.źródło
3 :'4 8 4-:#/.~/:~|,-/~y'
Python, 71
42Zaktualizuj 1), aby wymagać 4 różnych punktów (dawałoby to fałszywie dodatnie wyniki dla powtarzających się punktów - czy są inne?) 2), aby zdefiniować funkcję według specyfikacji
W przypadku kwadratu wektor między dowolnymi dwoma punktami musi wynosić 0 (ten sam punkt), bok lub przekątną. Tak więc zestaw wielkości tych wektorów musi mieć długość 3.
źródło
Haskell, 100 znaków
Oto jak napisałbym rozwiązanie JB JB w Haskell. Bez próby zniszczenia czytelności poprzez usunięcie nieistotnych znaków, jest około 132 znaków:
Możesz zeskrobać go trochę do 100, usuwając nadmiar spacji i zmieniając nazwy niektórych rzeczy
Użyjmy QuickCheck, aby upewnić się, że akceptuje on dowolne kwadraty, z jednym wierzchołkiem w (x, y) i wektorem krawędzi (a, b):
Próbowanie w ghci:
No tak, pusty kwadrat nie jest tutaj uważany za kwadrat, więc zmienimy nasz test:
I spróbuj ponownie:
źródło
d
.s l=[4,8,4]==(map length.group.sort)[(x-a)^2+(y-b)^2|(x,y)<-l,(a,b)<-l]
Czynnik
Implementacja w języku programowania Factor :
I niektóre testy jednostkowe:
źródło
OCaml, 145
164Uruchom tak:
Odszyfrujmy i wyjaśnijmy trochę.
Najpierw określamy normę:
Zauważysz, że nie ma połączenia z sqrt, nie jest tu potrzebne.
Tutaj a, b, c i d są punktami. Zakładamy, że te punkty są przedstawione w następujący sposób:
Jeśli mamy kwadrat, wszystkie te warunki muszą obejmować:
Pamiętaj, że zawsze obowiązują następujące zasady:
Wykorzystamy to, aby uprościć naszą funkcję testową poniżej.
Ponieważ nasze dane wejściowe nie są uporządkowane, musimy również sprawdzić wszystkie permutacje. Bez utraty ogólności możemy uniknąć permutacji pierwszego punktu:
Po uproszczeniu:
Edycja: postępowała zgodnie z radą M. Giovanniniego.
źródło
n
do obniżenia 20 znaków:let t a b c d=a%b+a%c=b%c&&d%c+d%b=b%c&&a%b=a%c&&d%c=d%b
.Python (105)
Punkty są reprezentowane przez
(x,y)
krotki. Punkty mogą być w dowolnej kolejności i akceptują tylko kwadraty. Tworzy listęs
odległości parami (niezerowymi) między punktami. Łącznie powinno być 12 odległości, w dwóch unikalnych grupach.źródło
f([(0,0),(0,4),(2,2),(-2,2)])
jest kwadratowyPython - 42 znaki
Wygląda na to, że poprawiono użycie liczb zespolonych dla punktów
gdzie A = [(11 + 13j), (14 + 12j), (13 + 9j), (10 + 10j)]
stara odpowiedź:
Punkty są określone w dowolnej kolejności jako lista, np
źródło
>>> A=[(0,0),(0,0),(1,1),(0,0)] >>> len(set((a-c)**2+(b-d)**2 for(a,b),(c,d)in combinations(A,2)))==2 True
A=[(0,0),(0,4),(2,2),(-2,2)]; len(set((a-c)**2+(b-d)**2 for(a,b),(c,d)in combinations(A,2)))==2
C # - niezupełnie krótki. Nadużywanie LINQ. Wybiera odrębne dwie kombinacje punktów na wejściu, oblicza ich odległości, a następnie sprawdza, czy dokładnie cztery z nich są równe i czy istnieje tylko jedna inna wyraźna wartość odległości. Point to klasa z dwoma podwójnymi członkami, X i Y. Z łatwością może być Tuple, ale meh.
źródło
PHP, 82 znaki
źródło
K - 33
Tłumaczenie rozwiązania J przez JB :
K cierpi tutaj z powodu zarezerwowanych słów (
_sqr
i_sqrt
).Testowanie:
źródło
OCaml + Baterie, 132 znaki
(patrz, Ma, bez spacji!) Zrozumienie listy
q
tworzy listę kwadratowych norm dla każdej odrębnej nieuporządkowanej pary punktów. Kwadrat ma cztery równe boki i dwie równe przekątne, przy czym kwadratowe długości tego ostatniego są dwa razy większe od kwadratowych długości poprzedniego. Ponieważ w sieci liczb całkowitych nie ma trójkątów równobocznych, test nie jest tak naprawdę konieczny, ale uwzględniam go dla kompletności.Testy:
źródło
Mathematica
65 80 6966Sprawdza, czy liczba wyraźnych odległości między punktami (nie licząc odległości od punktu do siebie) wynosi 2, a krótsza z nich nie jest równa 0.
Stosowanie
NB:
\[And]
jest pojedynczą postacią w Mathematica.źródło
Galaretki , 8 bajtów
Wypróbuj online!
Pobiera listę liczb zespolonych jako argument wiersza poleceń. Odbitki
1
lub0
.To wydaje się być przyjemnym wyzwaniem, aby ożywić!
źródło
Haskell (212)
Naiwna pierwsza próba. Sprawdza następujące dwa warunki dla wszystkich permutacji wejściowej listy punktów (gdzie dana permutacja reprezentuje, powiedzmy, uporządkowanie punktów zgodnie z ruchem wskazówek zegara):
Odszyfrowany kod i testy
źródło
Scala (146 znaków)
źródło
JavaScript 144 znaki
Matematycznie równa odpowiedzi J Bs. Generuje 6 długości i zapewnia, że 2 największe są równe, a 4 najmniejsze są równe. Dane wejściowe muszą być tablicą tablic.
źródło
PHP,
161158 znakówDowód (1x1): http://codepad.viper-7.com/ZlBpOB
Jest to oparte na odpowiedzi JavaScript na eBuisness .
źródło
JavaScript 1.8, 112 znaków
Aktualizacja: zapisano 2 znaki, składając razem tablice.
Kolejne powtórzenie odpowiedzi JB. Wykorzystuje funkcje JavaScript 1.7 / 1.8 (zamykanie wyrażeń, interpretacja tablic, przypisywanie destrukcyjne). Nadużywają również
~~
(podwójnie bitowe nie operatora)undefined
przymusu do liczbowego, z przymusem tablic na ciąg i wyrażeniem regularnym, aby sprawdzić, czy liczy się długość[4, 8, 4]
(zakłada, że przekazano dokładnie 4 punkty). Nadużycie operatora przecinka to stara zaciemniona sztuczka C.Testy:
źródło
GoRuby - 66 znaków
rozszerzony:
Ten sam algorytm co odpowiedź JB .
Testuj jak:
Dane wyjściowe
true
dla true i puste dla falseźródło
ruby -r ./golf-prelude.rb FILE_TO_RUN.rb
go, i będzie działało dokładnie tak samo.sort
przedgroup_by
..sort.group_by {...}
należy zapisać jako.group_by {...}
Python 97 (bez punktów złożonych)
Spowoduje to pobranie list krotek punktowych w [(x, y), (x, y), (x, y), (x, y)] w dowolnej kolejności i może obsłużyć duplikaty lub niewłaściwą liczbę punktów. NIE wymaga złożonych punktów, takich jak inne odpowiedzi w języku Python.
Możesz to przetestować w następujący sposób:
To wymaga trochę wyjaśnienia, ale ogólną ideą jest to, że istnieją tylko trzy odległości między punktami w kwadracie (bok, przekątna, zero (punkt w porównaniu do siebie)):
Aby zapisać znaki kodowe, jestem:
Obawiam się, że ktoś może znaleźć przypadek testowy, który to psuje. Więc proszę, zrób i źle. Na przykład fakt, że sprawdzam tylko trzy odległości, zamiast wykonywania abs () i sprawdzania długości boku i przeciwprostokątnej, wydaje się błędem.
Pierwszy raz próbowałem golfa kodowego. Bądź miły, jeśli złamałem jakieś zasady domu.
źródło
Clojure, 159 znaków.
Edycja: aby trochę wyjaśnić.
(Uwaga: kwadratowe rootowanie nie jest potrzebne, a zatem w kodzie zapisanym powyżej.)
źródło
C #, 107 znaków
Gdzie punkty to Lista Vector3D zawierająca punkty.
Oblicza wszystkie odległości do kwadratu między wszystkimi punktami, a jeśli istnieją dokładnie trzy różne typy (musi wynosić 0, niektóre wartości a, i 2 * a) i 4 różne punkty, wówczas punkty tworzą kwadrat.
źródło
Python, 66
Poprawienie odpowiedzi konia papierowego z 76 na 66:
źródło
Python 2 , 49 bajtów
Wypróbuj online!
Pobiera na wejściu listę czterech liczb zespolonych. Obraca każdy punkt o 90 stopni wokół średniej i sprawdza, czy każdy wynikowy punkt znajduje się na oryginalnej liście.
Ta sama długość (choć krótsza przy użyciu Python 3
{*l}
).Wypróbuj online!
źródło
^
można użyć zamiast==
.Wolfram Language (Mathematica) ,
3231 bajtówWypróbuj online!
Pobiera listę punktów reprezentowanych przez liczby zespolone, oblicza drugi i trzeci centralny moment i sprawdza, czy oba są równe zero.
Bez golfa:
lub
dowód
To kryterium działa na całej płaszczyźnie złożonej, nie tylko na liczbach całkowitych Gaussa .
Po pierwsze, zauważamy, że momenty centralne nie zmieniają się, gdy punkty są tłumaczone razem. Dla zestawu punktów
wszystkie momenty centralne są niezależne
c
(dlatego nazywane są centralnymi ):Po drugie, momenty centralne mają prostą zależność od ogólnego złożonego skalowania (skalowania i obrotu) zestawu punktów:
Oznacza to, że jeśli moment centralny wynosi zero, wówczas skalowanie i / lub obracanie zestawu punktów utrzyma moment centralny równy zero.
Po trzecie, udowodnijmy kryterium dla listy punktów, w której pierwsze dwa punkty są ustalone:
W jakich warunkach rzeczywiste i urojone części drugiego i trzeciego centralnego momentu są zerowe?
Wszystkie te sześć rozwiązań reprezentują kwadraty: Dlatego jedynym sposobem, w jaki lista punktów formy
{0, 1, x[3] + I*y[3], x[4] + I*y[4]}
może mieć zero sekund i trzeci centralny moment, jest to, że cztery punkty tworzą kwadrat.Ze względu na właściwości translacji, obrotu i skalowania przedstawione w punktach 1 i 2 oznacza to, że za każdym razem, gdy drugi i trzeci centralny moment są zerowe, mamy kwadrat w pewnym stanie translacji / obrotu / skalowania. ∎
uogólnienie
K-ty centralny moment zwykłego n-gonu wynosi zero, jeżeli k nie jest podzielne przez n. Wystarczającą liczbę tych warunków należy połączyć, aby stworzyć wystarczające kryterium wykrywania n-gonów. Dla przypadku n = 4 wystarczyło wykryć zera w k = 2 i k = 3; w celu wykrycia np. sześciokątów (n = 6) może być konieczne sprawdzenie k = 2,3,4,5 dla zer. Nie udowodniłem, co następuje, ale podejrzewam, że wykryje każdy regularny n-gon:
Wyzwanie kodu jest zasadniczo tym kodem specjalizującym się w listach o długości 4.
źródło
J,
31 29 2726sprawdza, czy 8 najmniejszych odległości między punktami jest takich samych.sprawdza, czy istnieją dokładnie trzy rodzaje odległości między punktami (zero, długość boku i długość po przekątnej).4 2 $
jest sposobem na napisanie tablicy w J.źródło
Smalltalk na 106 znaków
gdzie p jest zbiorem punktów, np
Myślę, że matematyka jest zdrowa ...
źródło
Mathematica, 123 znaki (ale możesz zrobić to lepiej):
Gdzie „a” to dane wejściowe w formie listy Mathematica, np .:
a={{0,0},{3,4},{8,4},{5,0}}
Kluczem jest przyjrzenie się iloczynom kropkowym między wszystkimi wektorami i zauważeniu, że muszą mieć dokładnie trzy wartości: 0, x i 2 * x dla pewnej wartości x. Produkt w kropki sprawdza zarówno prostopadłość, jak i długość w jednym pęczniejącym źdźble.
Wiem, że istnieją skróty matematyczne, które mogą uczynić to krótszymi, ale nie wiem, jakie są.
źródło
Union
zamiastSort@DeleteDuplicates
.#[[1]] == 0 && #[[3]]/#[[2]] == 2 &[ Union@Abs@Flatten[Table[c.d, {c, #}, {d, #}]] &[ Flatten[Table[x - y, {x, a}, {y, a}], 1]]]
Haskell, „wc -c” zgłasza 110 znaków. Nie sprawdza, czy wejście ma 4 elementy.
Testowałem na
źródło