En este desafío, se le dan dos rectángulos superpuestos, y necesita calcular los rectángulos creados al eliminar uno del otro.
Por ejemplo, si quita el rectángulo rojo del negro:
Terminas con uno de los siguientes dos conjuntos de rectángulos:
También deberá manejar lo siguiente:
Para ser más explícito:
- Ingresará las coordenadas de dos rectángulos, A y B.
- Debe generar la menor cantidad de rectángulos no superpuestos que cubran toda el área de A sin B. Se permite cualquier cobertura posible
- Las coordenadas rectangulares se pasan como 4 enteros. Puede pasarlos en dos pares (que representan los dos puntos de esquina), o como una tupla / lista de 4 enteros. Sus entradas y salidas deben ser consistentes.
- A y B no necesariamente se superpondrán o tocarán, y cada uno tendrá un área de al menos 1
Casos de prueba:
[(0 0) (5 5)] [(3 4) (8 7)] -> [(0 0) (5 4)] [(0 4) (3 5)] # or [(0 0) (3 5)] [(3 0) (5 4)]
[(2 4) (10 11)] [(5 5) (6 6)] -> [(2 4) (10 5)] [(2 5) (5 6)] [(6 5) (10 6)] [(2 6) (10 11)] #Other sets of 4 rectangles are possible
[(3 3) (8 8)] [(0 1) (10 8)] -> #No rectangles should be output
[(0 0) (5 5)] [(1 1) (10 2)] -> [(0 0) (1 5)] [(1 0) (2 1)] [(2 0) (5 5)] #Other sets of 3 rectangles are possible
[(1 5) (7 8)] [(0 0) (1 10)] -> [(1 5) (7 8)] #Only possible output
[(4 1) (10 9)] [(2 5) (20 7)] -> [(4 1) (10 5)] [(4 7) (10 9)] #Only possible output
[(1 1) (8 8)] [(0 6) (9 9)] -> [(1 1) (8 6)] #Only possible output
Este es un código de golf , ¡así que haga su código lo más corto posible!
code-golf
geometry
grid
set-partitions
Nathan Merrill
fuente
fuente
{(x1, y1), (x2, y2)}
es válidax1 < x2
yy1 < y2
?Respuestas:
Python 2 ,
375360345343 bytesPruébalo en línea!
EDICIONES: -15 de sugerencias de @notjagan; otro -15 al volver a codificar la matriz de rectángulos de solución en formato int36 y una tabla de búsqueda corta; otro -2 al reemplazar el producto con p según @musicman.
Una función que toma dos rectángulos, cada rect es una tupla de ((izquierda, arriba), (derecha, abajo)); devuelve una lista de los rectángulos resultantes.
La estrategia básica:
En el diagrama anterior, los puntos A y B son la esquina superior izquierda y la inferior derecha, respectivamente, del rectángulo 'Fuente' (el primer rectángulo).
Encontramos la ubicación de cada una de las partes superior izquierda
(u,v)
e inferior derecha(x,y)
del rectángulo 'Máscara' en esa cuadrícula.Si ambos puntos están en la primera o última columna; o primera o última fila; entonces no hay superposición; y podemos devolver solo la fuente rect.
De lo contrario, quedan 16 casos; por ejemplo, el primer ejemplo del OP es el caso en el que podemos etiquetar
(1,1),(2,2)
. Cada caso se puede asignar a un conjunto de rectángulos resultantes cuyas esquinas siempre son coordenadas con valores horizontales en los rectángulos de origen a la izquierda, a la derecha o en los rectángulos de máscara a la izquierda, a la derecha; y de manera similar para los valores verticales, la parte superior, inferior o las máscaras de la fuente.Por ejemplo, para el
(1,1),(2,2)
caso, los rectángulos serían((l,t),(T,r))
y((l,T),(R,b))
, dondel,t,r,b
yL,T,R,B
son los lados izquierdo, superior, derecho e inferior de los rectángulos Fuente y Máscara, respectivamente.Por lo tanto, podemos crear una tabla de búsqueda que asigne las coordenadas al conjunto de todas esas combinaciones posibles (que es de lo que se trata el
product(product(*zip(*)))
bit) a un conjunto de rectángulos que se deben proporcionar para cada uno de los casos (que, después de una descompresión de golf) , es de lo que trata el resto de la lista).fuente
p=product
y reemplazandoproduct(product
conp(p
JavaScript, 115 bytes
versión superpuesta:
Entrada en el siguiente formato:
f([1,1,8,8])([0,6,9,9])
Denote la entrada como ((x1, y1), (x2, y2)), ((x3, y3), (x4, y4))
Si se cumple alguna de las siguientes condiciones, devuelve el primer rectángulo tal como está:
de otra manera
fuente
f([0, 30, 10, 40])([5, 1, 6, 2])
debería regresar[[0, 30, 10, 40]]
pero en su lugar regresa[[0,30,5,40],[6,30,10,40]]
Java, 268 bytes
Sin golf
Pase la entrada como argumentos. Ejemplo
fuente
Python 2 , 272 bytes
Pruébalo en línea!
Esto funciona probando cada celda dentro del primer rectángulo para izquierda = 1, superioridad = 4, rectitud = 2 e inferioridad = 8 w / r a la otra, y ORing el resultado. Si el otro no se cruza = 0 con el primero, entonces se devuelve el original, de lo contrario se devuelve alguna combinación de un corte izquierdo, un corte derecho, un corte superior y un corte inferior, con acomodación para la superposición.
fuente