Nesse desafio, você recebe dois retângulos sobrepostos e precisa calcular os retângulos criados removendo um do outro.
Por exemplo, se você remover o retângulo vermelho do preto:
Você acaba com um dos dois conjuntos de retângulos a seguir:
Você também precisará lidar com o seguinte:
Para ser mais explícito:
- Você introduzirá as coordenadas de dois retângulos, A e B.
- Você precisa produzir o menor número de retângulos sem sobreposição que cubram toda a área de A sem B. Qualquer cobertura possível é permitida
- As coordenadas retangulares são passadas como 4 números inteiros. Você pode passá-los em dois pares (representando os dois pontos de canto) ou como uma tupla / lista de 4 números inteiros. Suas entradas e saídas precisam ser consistentes.
- A e B não necessariamente se sobrepõem ou se tocam, e cada um terá uma área de pelo menos 1
Casos de teste:
[(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 é um código de golfe , portanto, faça seu código o mais curto possível!
code-golf
geometry
grid
set-partitions
Nathan Merrill
fonte
fonte
{(x1, y1), (x2, y2)}
é válidax1 < x2
ey1 < y2
?Respostas:
Python 2 ,
375360345343 bytesExperimente online!
EDITS: -15 de sugestões de @notjagan; outro -15 recodificando a matriz de retângulos da solução para o formato int36 e uma tabela de pesquisa curta; outro -2 substituindo o produto por p conforme @musicman.
Uma função que usa dois retângulos, cada um sendo uma tupla de ((esquerda, superior), (direita, inferior)); retorna uma lista dos retângulos resultantes.
A estratégia básica:
No diagrama acima, os pontos A e B são o canto superior esquerdo e o canto inferior direito, respectivamente, do retângulo 'Fonte' (o primeiro ret).
Encontramos o posicionamento de cada um dos cantos superior esquerdo
(u,v)
e inferior direito(x,y)
do retângulo 'Mask' nessa grade.Se esses dois pontos estiverem na primeira ou na última coluna; ou primeira ou última linha; então não há sobreposição; e podemos retornar apenas a fonte correta.
Caso contrário, restam 16 casos; por exemplo, o primeiro exemplo do OP é o caso que podemos rotular
(1,1),(2,2)
. Cada caso pode ser mapeado para um conjunto de retângulos resultantes cujos cantos são sempre coordenadas com valores horizontais nos retângulos de origem à esquerda, à direita ou nos retângulos da máscara à esquerda, à direita; e da mesma forma para os valores verticais, superior, inferior ou máscaras da fonte.Por exemplo, para o
(1,1),(2,2)
caso, os retângulos seriam((l,t),(T,r))
e((l,T),(R,b))
, ondel,t,r,b
eL,T,R,B
estão à esquerda, superior, direita e inferior dos retângulos Origem e Máscara, respectivamente.Assim, podemos criar uma tabela de pesquisa que mapeie as coordenadas para o conjunto de todas essas combinações possíveis (que é o que é o
product(product(*zip(*)))
bit) para um conjunto de retângulos que devem ser fornecidos para cada um dos casos (que, após algumas descompressões de golfe) , é disso que trata o restante do material da lista).fonte
p=product
e substituindoproduct(product
comp(p
JavaScript, 115 bytes
versão sobreposta:
Entrada no seguinte formato:
f([1,1,8,8])([0,6,9,9])
Indique entrada como ((x1, y1), (x2, y2)), ((x3, y3), (x4, y4))
Se qualquer uma das seguintes condições for atendida, retorne o primeiro retângulo como está:
de outra forma
fonte
f([0, 30, 10, 40])([5, 1, 6, 2])
deve retornar,[[0, 30, 10, 40]]
mas retorna[[0,30,5,40],[6,30,10,40]]
Java, 268 bytes
Ungolfed
Passe entrada como argumentos. Exemplo
fonte
Python 2 , 272 bytes
Experimente online!
Isso funciona testando todas as células dentro do primeiro retângulo quanto à esquerda = 1, acima = 4, direita = 2 e abaixo = 8 w / r para a outra e ORing como resultado. Se o outro não cruzar = 0 com o primeiro, o original será retornado; caso contrário, será retornada alguma combinação de uma fatia esquerda, direita, superior e inferior, com acomodação para sobreposição.
fonte