Znajdź obszar regionu komórek jednostkowych, biorąc pod uwagę jego obwodową pętlę jako sekwencję zwojów 90 stopni.
Na przykład weź region trzech komórek
XX
X
którego pętlę obwodową rysujemy
L<S<L
v ^
S R>L
v ^
L>L
Każdy zakręt jest oznaczony jako lewy (L), prosty (S) lub prawy (R). Zaczynając od R, są tury RLLSLSLL
. Tak więc, biorąc pod uwagę dane wejściowe RLLSLSLL
, powinniśmy wyprowadzić 3 dla obszaru.
Sekwencja wejściowa gwarantuje prześledzenie pętli obejmującej pojedynczy region po lewej stronie.
- Ścieżka kończy się w punkcie początkowym, twarzą do początkowego kierunku i tworzy pętlę.
- Pętla nie przecina się ani nie dotyka.
- Pętla biegnie w kierunku przeciwnym do ruchu wskazówek zegara wokół regionu.
I / O
Możesz przyjmować dane wejściowe jako listę lub ciąg znaków LSR
lub jako liczby -1, 0, 1
dla lewej, prostej, prawej. Wyjście jest dodatnią liczbą całkowitą. Pływaki są w porządku.
Przypadki testowe
Dane wejściowe są podawane w obu formatach, a następnie ich odpowiednie dane wyjściowe.
RLLSLSLL
LLLL
SLLSLL
LSRRSLLSSLSSLSSL
SSSSSLSSSSSLSSSSSLSSSSSL
[1, -1, -1, 0, -1, 0, -1, -1]
[-1, -1, -1, -1]
[0, -1, -1, 0, -1, -1]
[-1, 0, 1, 1, 0, -1, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]
[0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1]
3
1
2
7
36
JavaScript (ES6),
5250 bajtówZaoszczędź 2 bajty dzięki @Neil
Oczekuje drugiego formatu wejściowego.
Wypróbuj online!
W jaki sposób?
Opis ten odnosi się do wersji poprzedniej : x i y od tego czasu zostały odwrócone.
Jest to oparte na formule już wspomnianej przez @ngn : A = Σ (x i - x i + 1 ) y i , którą można również zapisać jako Σdx i y i gdzie dx i wynosi -1, 0 lub 1.
Zaczynamy od r = y = 0 .
Mamy śledzić aktualny kierunek w :
Jest aktualizowany o
a = a + k & 3
, gdzie k jest bieżącym elementem tablicy wejściowej.Ponieważ początkowo zawiera tablicę wejściową, a + k jest zmuszany do NaN na pierwszej iteracji, a następnie do 0 , gdy jest stosowana bitowe AND. Oznacza to, że pierwsza zmiana kierunku jest faktycznie ignorowana i zawsze zaczynamy kierować się na wschód. To nie ma znaczenia, ponieważ obszar pozostaje taki sam, bez względu na orientację ostatecznego kształtu.
Następnie aktualizujemy y przy pomocy
y += (2 - a) % 2
.Wreszcie, obliczyć -dx z
~-a % 2
odjąć y * -dx z R , które - na zakończenie procesu - jest naszym wynik końcowy.źródło
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r
oszczędza 2 bajty.Python 2 , 64 bajty
Wypróbuj online!
Oblicza ∑xΔy przy użyciu liczb zespolonych.
źródło
Haskell ,
717069 bajtówObjaśnienie: Twierdzenie Greena daje wzór na obszar: A = ½∑ (x k + 1 + x k ) (y k + 1 -y k ), co upraszcza A = ½∑ Δx = 0 2x k Δy + ½∑ Δy = 0 (x k + 1 + x k ) * 0 = ∑xΔy, gdy skręty mają 90 stopni wzdłuż osi. Mamy następujący pseudokod dla rekurencyjnej funkcji globowania skrętu, która śledzi pozycję i kierunek x:
gdzie nowy kierunek, AA i Δx można zobaczyć w poniższych tabelach. Widzimy sinusoidalną cykliczność o długości cztery zarówno w andA, jak i Δx wzdłuż osi przekątnej
dir+turn
, która jest realizowana za pomocąsin
zamiast modułowej arytmetyki.Wypróbuj online!
źródło
Wolfram Language (Mathematica) ,
3630 bajtówJeśli masz starszą wersję Mathematica (~ v10), będziesz potrzebować
Most@
przed nią,AnglePath
aby uniknąć zamknięcia wielokąta. (Podziękowania dla @ user202729 za wskazówki).oryginalny: Wypróbuj online!
zaktualizowano: Wypróbuj online!
źródło
#.5Pi
wydaje się działać.Most
.Galaretka ,
1511 bajtówDzięki @xnor za wskazanie bezużytecznego kroku, oszczędzając 2 bajty
Dziękujemy @dylnan za zapisanie kolejnego bajtu
Oczekuje drugiego formatu wejściowego. Zwraca liczbę zmiennoprzecinkową.
Wypróbuj online! lub uruchom wszystkie przypadki testowe
Skomentował
źródło
+\ı*Ḟ_\×ƊĊS
zapisuje bajtPython 2 , 62 bajty
Wypróbuj online!
Podobne do rozwiązania Lynn , ale przy użyciu złożonej arytmetyki, aby wyodrębnić odpowiedni składnik liczby zespolonej za jednym razem.
źródło
Pyt , 25 bajtów
Używa
-1, 0, 1
formatu wejściowego.Wypróbuj tutaj!
źródło
Pyth , 14 bajtów
Zestaw testowy
Wyraża to obszar jako sumę
-1/2 * g(sum(l))
wszystkich sąsiednich podlistl
na wejściu, gdzieg
indeksowane jest modułowo[0,1,0,-1]
. Kod implementujeg
jakog(x)=imag(1j**x)
. Może istnieć krótsza metoda z bezpośrednim indeksowaniem modułowym, użyciemsin
lub funkcją arytmetycznąx%4
.źródło