Oblicz obszar wielokąta.
Zainspirowany tym wideo z algorytmem sznurowadła.
Zadanie
Twoim zadaniem jest stworzenie programu lub funkcji, która oblicza pole wielokąta. Program lub funkcja jest zdefiniowana zgodnie z domyślną definicją w meta.
Wejście
Otrzymasz współrzędne X i Y każdego wierzchołka wielokąta. Możesz wziąć dane wejściowe jako listę krotek ( [[x1, y1], [x2, y2], etc]
), macierzy lub płaskiej listy ( [x1, y1, x2, y2, etc]
). Dopuszczalne są również dwie listy zawierające odpowiednio x
i y
współrzędne. Wierzchołki są ponumerowane przeciwnie do ruchu wskazówek zegara, a pierwszy wierzchołek jest taki sam jak ostatni podany wierzchołek, zamykając w ten sposób wielokąt.
Jeśli chcesz, możesz wziąć dane wejściowe bez ostatniego wierzchołka (więc otrzymaj każdą współrzędną tylko raz).
Możesz założyć, że krawędzie wielokątów się nie przecinają. Możesz również założyć, że wszystkie wierzchołki mają współrzędne całkowite.
Wynik
Obszar wielokąta. Wszystkie standardowe metody wyjściowe są dozwolone. Jeśli twój język nie pozwala na dzielenie zmiennoprzecinkowe, a rozwiązaniem nie byłaby liczba całkowita, możesz zwrócić ułamek. Ułamek nie musi być koniecznie uproszczony, więc zwrot 2/4
byłby dozwolony.
Kryterium wygranej
Najkrótszy kod wygrywa!
Przypadki testowe
[[4,4],[0,1],[-2,5],[-6,0],[-1,-4],[5,-2],[4,4]]
55
[[1,1],[0,1],[1,0],[1,1]]
0.5
1/2
[x1, x2, x3], [y1, y2, y3]
dozwolone?Odpowiedzi:
Galaretka ,
86 bajtów-1 bajt dzięki Emignie (redundantny
€
,ÆḊ
ma lewą głębokość 2)-1 bajt dzięki Emignie, znowu (o połowę
H
, jest zmiennoprzecinkowy nie ma potrzeby÷2
)Monadyczny link pobierający listę par współrzędnych w kierunku przeciwnym do ruchu wskazówek zegara, zgodnie z przykładami (z jednym powtórzeniem) i zwracający obszar.
Wypróbuj online!
W jaki sposób?
Stosuje algorytm sznurowadła, dokładnie tak, jak opisano w filmie (który zdarzyło mi się oglądać także innego dnia!)
źródło
[x,y]
współrzędne są one podawane zgodnie z ruchem wskazówek zegara, a nie przeciwnie do ruchu wskazówek zegara. Wejście[[1,1],[0,1],[1,0],[1,1]]
zwróci a0.5
.H
zamiast÷2
Mathematica, 13 bajtów
źródło
Oktawa , 9 bajtów
Wejściami są wektor o wartościach x i wektor o wartościach y . Działa to również w MATLAB.
Wypróbuj online!
źródło
JavaScript (ES6),
696747 bajtówDzięki @Rick za zauważenie, że nie potrzebujemy wartości bezwzględnej, jeśli gwarantowane jest sortowanie wierzchołków w kolejności przeciwnej do ruchu wskazówek zegara, oraz za zasugerowanie przyjęcia płaskiej listy jako danych wejściowych, oszczędzając 20 bajtów!
Pobiera dane wejściowe jako płaską listę wierzchołków, w tym ostatni wierzchołek.
Wypróbuj online!
W jaki sposób?
źródło
a=>(g=([x,y,...a])=>1-a?0:x*a[1]-y*a[0]+g(a))(a)/2
R,
5452 bajtówKtóry ocenia się na funkcję:
Wykorzystuje predefiniowane
F = FALSE = 0
. Implementuje algorytm sznurowadła w połączonym wideo :)-2 bajty dzięki Giuseppe
źródło
i+-1:0
jako indeksu wiersza+
;)Python 3 ,
7271 bajtówPobiera dwie listy, jak to było dozwolone w komentarzach
Wypróbuj online!
Jest to w zasadzie tylko wdrożenie formuły sznurowadła . Czy mogę uzyskać dodatkowe punkty za golfa, który faktycznie wprowadzilibyście w ten sposób? :RE
-1, nie ma potrzeby odstępu
x,y:
.źródło
lambda x,y:
jest w porządku.Matematyka , 31 bajtów
Wypróbuj online!
Mathematica, 25 bajtów
źródło
JS (ES6),
98959493888682817773 bajtówPobiera dane wejściowe
[x1, x2, x3], [y1, y2, y3]
i pomija powtarzającą się parę współrzędnych.-3 bajty dzięki @JarkoDubbeldam
-4 bajty dzięki @JarkoDubbeldam
-1 bajt dzięki @ZacharyT
-4 bajty dzięki @ZacharyT
-4 bajty dzięki @Rick
źródło
J, 12 bajtów
Zakładając, że dane wejściowe to lista 2 list elementów (tj. Tabela)
2[\
- rozkłada go na sznurowadło Xs, tzn. nakładające się kwadraty 4 wiązów-/ .*
- wyznacznik każdego z nich+/
- podsumuj to-:
- podzielić przez 2Jeśli otrzymamy dane wejściowe jako pojedynczą listę, musimy najpierw przekształcić się w tabelę, dając nam 20 bajtów:
źródło
MS-SQL, 66 bajtów
MS SQL 2008 i nowsze wersje obsługują dane przestrzenne / funkcje Open Geospatial Consortium (OGC), z których korzystam.
Dane wejściowe są przechowywane w polu p istniejącej tabeli g , zgodnie z naszymi standardami wejściowymi .
Dane wejściowe to pole tekstowe z uporządkowanymi parami w następującym formacie:
(4 4,0 1,-2 5,-6 0,-1 -4,5 -2,4 4)
Teraz dla zabawy, jeśli pozwolisz, aby moja tabela wprowadzania zawierała obiekty geometrii zgodne ze standardem Open Geospatial Consortium (zamiast tylko danych tekstowych), staje się to prawie banalne:
źródło
Haskell , 45 bajtów
Wypróbuj online!
źródło
Perl 5
-pa
, 62 bajtyWypróbuj online!
Pobiera dane wejściowe jako listę współrzędnych X w pierwszym wierszu, a następnie listę współrzędnych Y w drugim wierszu.
źródło