Trouvez l'aire d'une région de cellules unitaires en fonction de sa boucle de périmètre sous la forme d'une séquence de virages à 90 degrés.
Par exemple, prenez la région à trois cellules
XX
X
dont on trace la boucle de périmètre
L<S<L
v ^
S R>L
v ^
L>L
Chaque virage est marqué comme gauche (L), droit (S) ou droit (R). À partir du R, les virages sont RLLSLSLL
. Donc, étant donné l'entrée RLLSLSLL
, nous devrions sortir 3 pour la zone.
La séquence d'entrée est garantie pour tracer une boucle entourant une seule région sur sa gauche.
- Le chemin se termine au point de départ, face à la direction initiale, formant une boucle.
- La boucle ne se traverse pas et ne se touche pas.
- La boucle va dans le sens antihoraire autour d'une région.
E / S
Vous pouvez prendre la saisie sous forme de liste ou de chaîne de caractères LSR
, ou sous forme de chiffres -1, 0, 1
pour gauche, droite, droite. La sortie est un entier positif. Les flotteurs sont OK.
Cas de test
Les entrées sont données dans les deux formats suivies de leurs sorties respectives.
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 octetsSauvegardé 2 octets grâce à @Neil
Attend le deuxième format d'entrée.
Essayez-le en ligne!
Comment?
Cette description s'applique à la version précédente : x et y ont depuis été inversés.
Ceci est basé sur la formule déjà mentionnée par @ngn : A = Σ (x i - x i + 1 ) y i , qui peut également s'écrire Σdx i y i où dx i vaut -1, 0 ou 1.
Nous commençons par r = y = 0 .
Nous gardons une trace de la direction actuelle dans un :
Il est mis à jour avec
a = a + k & 3
, où k est l'élément actuel du tableau d'entrée.Dans la mesure où a contient initialement le tableau d'entrée, a + k est contraint à NaN lors de la première itération, puis à 0 lorsque le AND au niveau du bit est appliqué. Cela signifie que le premier changement de direction est en fait ignoré et nous commençons toujours à nous diriger vers l'Est. Cela n'a pas d'importance car la zone reste la même, quelle que soit l'orientation de la forme finale.
Ensuite, nous mettons à jour y avec
y += (2 - a) % 2
.Enfin, nous calculons -dx avec
~-a % 2
et soustrayons y * -dx de r , qui - à la fin du processus - est notre résultat final.la source
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r
enregistre 2 octets.Python 2 , 64 octets
Essayez-le en ligne!
Calcule ∑xΔy en utilisant des nombres complexes.
la source
Haskell ,
717069 octetsExplication: le théorème de Green donne la formule de l'aire: A = ½∑ (x k + 1 + x k ) (y k + 1 -y k ), ce qui simplifie en A = ½∑ Δx = 0 2x k Δy + ½∑ Δy = 0 (x k + 1 + x k ) * 0 = ∑xΔy lorsque les virages sont de 90 degrés le long des axes. Nous avons le pseudocode suivant pour une fonction récursive de tournage qui garde la position et la direction x:
où la nouvelle direction, ΔA et Δx peut être vue dans les tableaux suivants. Nous pouvons voir une périodicité sinusoïdale de longueur quatre à la fois dans ΔA et Δx le long de l'axe diagonal
dir+turn
, qui est mise en œuvre en utilisantsin
au lieu de l'arithmétique modulaire.Essayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
3630 octetsSi vous avez une ancienne version de Mathematica (~ v10) dont vous aurez besoin
Most@
devantAnglePath
pour éviter de fermer le polygone. (Merci à @ user202729 pour les conseils).original: Essayez-le en ligne!
mis à jour: Essayez-le en ligne!
la source
#.5Pi
semble fonctionner.Most
aussi.Gelée ,
1511 octetsMerci à @xnor d'avoir signalé une étape inutile, économisant 2 octets
Merci à @dylnan d'avoir enregistré un autre octet
Attend le deuxième format d'entrée. Renvoie un flotteur.
Essayez-le en ligne!ou exécutez tous les cas de test
Commenté
la source
+\ı*Ḟ_\×ƊĊS
enregistre un octetPython 2 , 62 octets
Essayez-le en ligne!
Similaire à la solution de Lynn , mais en utilisant une arithmétique complexe pour extraire la bonne composante du nombre complexe en une seule fois.
la source
Pyth , 25 octets
Utilise le
-1, 0, 1
format d'entrée.Essayez-le ici!
la source
Pyth , 14 octets
Suite de tests
Cela exprime la zone comme la somme de
-1/2 * g(sum(l))
toutes les sous-listes contiguësl
sur l'entrée, d'oùg
l'indexation modulaire dans[0,1,0,-1]
. Le code implémenteg
commeg(x)=imag(1j**x)
. Il peut y avoir une méthode plus courte avec indexation modulaire directe, utilisationsin
ou fonction arithmétique activéex%4
.la source