Encontre a área de uma região de células unitárias, devido ao seu loop de perímetro, como uma sequência de curvas de 90 graus.
Por exemplo, considere a região de três células
XX
X
cujo perímetro desenhamos
L<S<L
v ^
S R>L
v ^
L>L
Cada turno é marcado como esquerdo (L), reto (S) ou direito (R). A partir do R, as curvas são RLLSLSLL
. Portanto, dada a entrada RLLSLSLL
, devemos produzir 3 para a área.
A sequência de entrada é garantida para rastrear um loop envolvendo uma única região à sua esquerda.
- O caminho termina no ponto inicial, voltado para a direção inicial, formando um loop.
- O loop não se cruza ou se toca.
- O loop segue no sentido anti-horário em torno de uma região.
I / O
Você pode usar a entrada como uma lista ou sequência de caracteres LSR
ou como números -1, 0, 1
para esquerda, reta, direita. A saída é um número inteiro positivo. Carros alegóricos estão OK.
Casos de teste
As entradas são fornecidas nos dois formatos, seguidas pelas respectivas saídas.
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 bytesGuardado 2 bytes graças a @Neil
Espera o segundo formato de entrada.
Experimente online!
Quão?
Esta descrição se aplica à versão anterior : x e y foram invertidos desde então.
Isso se baseia na fórmula já mencionada por @ngn : A = Σ (x i - x i + 1 ) y i , que também pode ser escrita como Σdx i y i onde dx i é -1, 0 ou 1.
Começamos com r = y = 0 .
Nós manter o controle de direção atual em um :
É atualizado com
a = a + k & 3
, onde k é o elemento atual da matriz de entrada.Como a inicialmente contém a matriz de entrada, a + k é coagido para NaN na primeira iteração e depois para 0 quando o AND bit a bit é aplicado. Isso significa que a primeira mudança de direção é realmente ignorada e sempre começamos a ir para o leste. Não importa, porque a área permanece a mesma, independentemente da orientação da forma final.
Então, atualizamos y com
y += (2 - a) % 2
.Finalmente, computamos -dx com
~-a % 2
e subtraímos y * -dx de r , que - no final do processo - é o nosso resultado final.fonte
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r
economiza 2 bytes.Python 2 , 64 bytes
Experimente online!
Calcula ∑xΔy usando números complexos.
fonte
Haskell ,
717069 bytesExplicação: O Teorema de Green fornece a fórmula para a área: A = ½∑ (x k + 1 + x k ) (y k + 1 -y k ), que simplifica para A = ½∑ Δx = 0 2x k Δy + ½∑ Δy = 0 (x k + 1 + x k ) * 0 = ∑xΔy quando as curvas são 90 graus ao longo dos eixos. Temos o seguinte pseudocódigo para uma função recursiva de deslizamento de curvas que controla a posição e a direção x:
onde a nova direção, ΔA e Δx pode ser vista nas tabelas a seguir. Podemos ver uma periodicidade sinusoidal de comprimento quatro em ΔA e Δx ao longo do eixo diagonal
dir+turn
, que é implementado usandosin
aritmética modular em vez da aritmética.Experimente online!
fonte
Wolfram Language (Mathematica) ,
3630 bytesSe você possui uma versão mais antiga do Mathematica (~ v10), precisará
Most@
na frenteAnglePath
para evitar fechar o polígono. (Obrigado a @ user202729 pelas dicas).original: Experimente online!
atualizado: Experimente online!
fonte
#.5Pi
parece funcionar.Most
também.Geléia ,
1511 bytesObrigado a @xnor por apontar uma etapa inútil, economizando 2 bytes
Obrigado a @dylnan por salvar outro byte
Espera o segundo formato de entrada. Retorna um flutuador.
Experimente online! ou execute todos os casos de teste
Comentado
fonte
+\ı*Ḟ_\×ƊĊS
salva um bytePython 2 , 62 bytes
Experimente online!
Semelhante à solução de Lynn , mas usando uma aritmética complexa para extrair o componente certo do número complexo de uma só vez.
fonte
Pitão , 25 bytes
Usa o
-1, 0, 1
formato de entrada.Experimente aqui!
fonte
Pitão , 14 bytes
Suíte de teste
Isso expressa a área como a soma de
-1/2 * g(sum(l))
todas as sublistas contíguasl
da entrada, ondeg
é feita a indexação modular[0,1,0,-1]
. O código implementag
comog(x)=imag(1j**x)
. Pode haver um método mais curto com indexação modular direta, usandosin
ou com uma função aritmética ativadax%4
.fonte