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 < x2yy1 < 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,byL,T,R,Bson 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=producty reemplazandoproduct(productconp(pJavaScript, 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