Ermitteln Sie die Fläche eines Bereichs von Einheitszellen anhand der Umfangsschleife als Folge von 90-Grad-Umdrehungen.
Nehmen Sie zum Beispiel den Bereich mit drei Zellen
XX
X
deren Umfangsschleife zeichnen wir
L<S<L
v ^
S R>L
v ^
L>L
Jede Abbiegung ist als links (L), gerade (S) oder rechts (R) markiert. Ausgehend vom R sind die Abbiegungen RLLSLSLL
. Bei einer gegebenen Eingabe RLLSLSLL
sollten wir also 3 für den Bereich ausgeben.
Die Eingangssequenz zeichnet garantiert eine Schleife auf, die eine einzelne Region auf der linken Seite umschließt.
- Der Pfad endet wieder am Startpunkt und zeigt in die ursprüngliche Richtung. Er bildet eine Schleife.
- Die Schleife kreuzt oder berührt sich nicht.
- Die Schleife dreht sich gegen den Uhrzeigersinn um eine Region.
I / O
Sie können Eingaben als Liste oder Zeichenfolge LSR
oder als Zahlen -1, 0, 1
für links, gerade, rechts vornehmen. Die Ausgabe ist eine positive Ganzzahl. Schwimmer sind in Ordnung.
Testfälle
Die Eingaben werden in beiden Formaten angegeben, gefolgt von den jeweiligen Ausgaben.
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),
52 bis50 Byte2 Bytes dank @Neil gespeichert
Erwartet das zweite Eingabeformat.
Probieren Sie es online!
Wie?
Diese Beschreibung gilt für die Vorgängerversion : x und y wurden inzwischen invertiert.
Dies basiert auf der bereits von @ngn erwähnten Formel : A = Σ (x i - x i + 1 ) y i , die auch als alsodx i y i mit dx i geschrieben werden kann entweder -1, 0 oder 1 ist.
Wir beginnen mit r = y = 0 .
Wir verfolgen die aktuelle Richtung in einem :
Es wird aktualisiert mit
a = a + k & 3
, wo k das aktuelle Element des Eingabearrays ist.Da a anfänglich das Eingabearray enthält, wird a + k bei der ersten Iteration zu NaN und dann zu 0 gezwungen wenn das bitweise UND angewendet wird. Das bedeutet, dass der erste Richtungswechsel ignoriert wird und wir immer nach Osten fahren. Es spielt keine Rolle, da die Fläche gleich bleibt, unabhängig von der Ausrichtung der endgültigen Form.
Dann aktualisieren wir y mit
y += (2 - a) % 2
.Schließlich berechnen wir -dx mit
~-a % 2
und subtrahieren y * -dx von r , was - am Ende des Prozesses - unser Endergebnis ist.quelle
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r
Spart 2 Bytes.Python 2 , 64 Bytes
Probieren Sie es online!
Berechnet ∑xΔy mit komplexen Zahlen.
quelle
Haskell ,
717069 BytesErklärung: Der Satz von Green gibt die Formel für die Fläche an: A = ½∑ (x k + 1 + x k ) (y k + 1 -y k ), die sich zu A = ½∑ Δx = 0 2x k Δy + ½∑ vereinfacht & Delta; y = 0 (x k + 1 + x k ) * 0 = ΣxΔy wenn Drehungen um 90 Grad entlang der Achsen sind. Wir haben den folgenden Pseudocode für eine rekursive Turn-Globbing-Funktion, die die x-Position und -Richtung verfolgt:
wobei die neue Richtung ΔA und Δx aus den folgenden Tabellen ersichtlich ist. Wir können eine sinusförmige Periodizität der Länge 4 sowohl in & Dgr; A als auch in & Dgr; x entlang der diagonalen Achse sehen
dir+turn
, die unter Verwendung vonsin
anstelle von modularer Arithmetik implementiert wird .Probieren Sie es online!
quelle
Wolfram Language (Mathematica) ,
36-30BytesWenn Sie eine ältere Version von Mathematica (~ v10) haben, müssen Sie
Most@
vorAnglePath
, um das Schließen des Polygons zu vermeiden. (Danke an @ user202729 für die Tipps).Original: Online ausprobieren!
aktualisiert: Probieren Sie es online!
quelle
#.5Pi
scheint zu funktionieren.Most
.Jelly ,
1511 BytesVielen Dank an @xnor für den Hinweis auf einen nutzlosen Schritt und das Speichern von 2 Bytes.
Vielen Dank an @dylnan für das Speichern eines weiteren Bytes
Erwartet das zweite Eingabeformat. Gibt einen float zurück.
Probieren Sie es online! oder führen Sie alle Testfälle aus
Kommentiert
quelle
+\ı*Ḟ_\×ƊĊS
speichert ein BytePython 2 , 62 Bytes
Probieren Sie es online!
Ähnlich wie bei Lynns Lösung , jedoch mit einer komplexen Arithmetik, um die richtige Komponente der komplexen Zahl auf einmal zu extrahieren.
quelle
Pyth , 25 Bytes
Verwendet das
-1, 0, 1
Eingabeformat.Probieren Sie es hier aus!
quelle
Pyth , 14 Bytes
Testsuite
Dies drückt den Bereich als die Summe
-1/2 * g(sum(l))
aller zusammenhängenden Unterlistenl
über die Eingabe aus, ing
die modular indiziert wird[0,1,0,-1]
. Der Code implementiertg
alsg(x)=imag(1j**x)
. Es kann eine kürzere Methode mit direkter modularer Indizierung, Verwendungsin
oder einer Arithmetikfunktion gebenx%4
.quelle