Encuentre el área de una región de celdas unitarias dado su bucle perimetral como una secuencia de giros de 90 grados.
Por ejemplo, tome la región de tres celdas
XX
X
cuyo bucle perimetral dibujamos
L<S<L
v ^
S R>L
v ^
L>L
Cada giro se marca como izquierda (L), recta (S) o derecha (R). A partir de la R, los turnos son RLLSLSLL
. Entonces, dada la entradaRLLSLSLL
, deberíamos generar 3 para el área.
Se garantiza que la secuencia de entrada trazará un bucle que encierra una sola región a su izquierda.
- El camino termina de regreso en el punto de inicio, mirando hacia la dirección inicial, formando un bucle.
- El bucle no se cruza ni se toca.
- El bucle va en sentido antihorario alrededor de una región.
I / O
Puede tomar la entrada como una lista o cadena de caracteres LSR
, o como números -1, 0, 1
para izquierda, recta, derecha. La salida es un entero positivo. Los flotadores están bien.
Casos de prueba
Las entradas se dan en ambos formatos seguidos de sus respectivas salidas.
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 gracias a @Neil
Espera el segundo formato de entrada.
Pruébalo en línea!
¿Cómo?
Esta descripción se aplica a la versión anterior : x e y desde entonces se han invertido.
Esto se basa en la fórmula ya mencionada por @ngn : A = Σ (x i - x i + 1 ) y i , que también se puede escribir como Σdx i y i donde dx i es -1, 0 o 1.
Comenzamos con r = y = 0 .
Realizamos un seguimiento de la dirección de la corriente en un :
Se actualiza con
a = a + k & 3
, donde k es el elemento actual de la matriz de entrada.Debido a que inicialmente contiene la matriz de entrada, a + k se coacciona a NaN en la primera iteración y luego a 0 cuando se aplica el AND a nivel de bits. Esto significa que el primer cambio de dirección se ignora y siempre comenzamos a dirigirnos hacia el este. No importa porque el área permanece igual, sin importar la orientación de la forma final.
Luego, actualizamos y con
y += (2 - a) % 2
.Finalmente, calculamos -dx con
~-a % 2
y restamos y * -dx de r , que - al final del proceso - es nuestro resultado final.fuente
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r
ahorra 2 bytes.Python 2 , 64 bytes
Pruébalo en línea!
Calcula ∑xΔy usando números complejos.
fuente
Haskell ,
717069 bytesExplicación: El teorema de Green da la fórmula para el área: A = ½∑ (x k + 1 + x k ) (y k + 1 -y k ), que se simplifica a A = ½∑ Δx = 0 2x k Δy + ½∑ Δy = 0 (x k + 1 + x k ) * 0 = ∑xΔy cuando los giros son 90 grados a lo largo de los ejes. Tenemos el siguiente pseudocódigo para una función recursiva de giro de globo que realiza un seguimiento de la posición y dirección x:
donde la nueva dirección, ΔA y Δx se puede ver en las siguientes tablas. Podemos ver una periodicidad sinusoidal de longitud cuatro en ΔA y Δx a lo largo del eje diagonal
dir+turn
, que se implementa utilizando ensin
lugar de aritmética modular.Pruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
3630 bytesSi tiene una versión anterior de Mathematica (~ v10) necesitará
Most@
frente aAnglePath
para evitar cerrar el polígono. (Gracias a @ user202729 por los consejos).original: ¡ Pruébelo en línea!
actualizado: ¡ Pruébelo en línea!
fuente
#.5Pi
parece funcionar.Most
.Jalea ,
1511 bytesGracias a @xnor por señalar un paso inútil, ahorrando 2 bytes
Gracias a @dylnan por guardar otro byte
Espera el segundo formato de entrada. Devuelve un flotador.
Pruébalo en línea! o ejecutar todos los casos de prueba
Comentado
fuente
+\ı*Ḟ_\×ƊĊS
guarda un bytePython 2 , 62 bytes
Pruébalo en línea!
Similar a la solución de Lynn , pero usando algo de aritmética compleja para extraer el componente correcto del número complejo de una vez.
fuente
Pyth , 25 bytes
Utiliza el
-1, 0, 1
formato de entrada.Pruébalo aquí!
fuente
Pyth , 14 bytes
Banco de pruebas
Esto expresa el área como la suma de
-1/2 * g(sum(l))
todas las sublistas contiguasl
sobre la entrada, donde seg
realiza la indexación modular[0,1,0,-1]
. El código se implementag
comog(x)=imag(1j**x)
. Puede haber un método más corto con indexación modular directa, usosin
o una función aritmética activadax%4
.fuente