Esse desafio é baseado em outro desafio semelhante. Como encontrar o empacotamento de retângulos mais eficiente é NP-difícil (ou seja, sua solução é fácil de verificar, mas difícil de encontrar), esse desafio é muito mais fácil do que este aqui
Este desafio
Dado um monte de retângulos, descubra se eles preenchem ou não um espaço retangular sem lacunas ou sobreposições.
Entrada
A entrada pode ser de duas formas, uma das quais tem uma penalidade de pontuação.
O primeiro: contém uma lista de sublistas, cada uma com comprimento 4. Esta lista contém 4 números inteiros, que são as coordenadas dos vértices opostos. Como todos os retângulos serão horizontais / verticais, não há ambiguidade quanto ao local onde o retângulo está. Cada sub-lista conterá quatro números inteiros, que, em ordem, são a coordenada x do primeiro vértice, a coordenada y do primeiro vértice, a coordenada x do segundo vértice e a coordenada y do segundo vértice.
O segundo: contém quatro listas de números inteiros com o mesmo comprimento. As quatro listas representam as diferentes coordenadas. Se você imaginar a opção de entrada 1 como uma matriz, a entrada aqui é apenas a transposição da matriz. Esta entrada possui uma +20%
penalidade de bytes.
Resultado
Saída simples de verdade / falsidade.
Especificações
Se houver um retângulo com a área 0 (ou seja, x1 == x2 || y1 == y2
), desconsidere esse retângulo (isso [0 0 1 1], [2 2 3 2]
é válido). Essa especificação existe para tornar mais difícil para as pessoas simplesmente obterem os valores mínimo / máximo x / y.
x1 <= x2
e y1 <= y2
nem sempre são verdadeiras. Se x1 > x2 || y1 > y2
, o retângulo não é um retângulo de área zero; em vez disso, ocupa o espaço retangular entre (x1, y1)
e (x2, y2)
.
As coordenadas podem ser negativas, caso em que ainda ocupam o espaço entre as coordenadas.
O retângulo superior esquerdo mais nem sempre está em (0, 0)
; portanto, o espaço retangular que é preenchido não necessariamente tem seu canto superior esquerdo em (0, 0)
.
(Agradecemos a @xnor por apontar essas ambiguidades)
Especifique como deseja sua entrada e como sua saída será representada.
Pontuação
Pontuação é o tamanho do código em bytes, mais uma penalidade de bytes, se aplicável. A pontuação mais baixa a partir de 15 de dezembro vence.
Casos de teste
0 0 1 2
1 0 3 1 ==> true
1 1 3 2
0 0 2 2
0 0 1 1 ==> false
0 0 0 0
0 0 1 1
2 2 2 2 ==> true
0 1 2 1
Boa sorte, feliz golfe!
fonte
x1 <= x2
ey1 <= y2
? É um retângulo da área 0 comx1 == x2
e éy1 <= y2
possível?x1 > x2
ey1 > y2
, é um retângulo de área zero porque as coordenadas são trocadas?Respostas:
JavaScript (ES6), 249 bytes
Nota: Para usar isso, avalie-o como uma sequência e atribua o resultado a uma variável ou insira a atribuição após o
with(Math)
. Explicação:with(Math)a=>!(
Trazermin
emax
dentro do escopo.a=a.map(([l,t,r,b])=>[l<r?l:r,t<b?t:b,l>r?l:r,t>b?t:b])
Normalizar as coordenadas.filter(g=([l,t,r,b])=>(r-l)*(b-t)))
Remova os retângulos vazios, definindo também uma função para calcular a área.reduce((s,b)=>s-g(b),
Subtraia as áreas de todos os retângulosg([min,min,max,max].map((f,i)=>f(...a.map(a=>a[i])))))
da área da caixa delimitadora>a.some(([l,t,r,b],i)=>a.some(([m,u,s,c],j)=>i!=j&l<s&m<r&t<c&u<b))
e verifique se nenhum retângulo se sobrepõe.fonte
with(Math)f=a=>
etc. - colocarf=
o início não funcionará.Mathematica, 194 bytes
Uma versão não destruída:
A linha 1 define
r
como o conjunto de retângulos não triviais da entrada fornecida. (Há muita coisa& @@
acontecendo nesse código; isso é apenas para que possamos usar#1,#2,#3,#4
os quatro elementos de uma lista em vez de#[[1]],#[[2]],#[[3]],#[[4]]
.) Então a linha 2 definem
as coordenadas do menor retângulo que limita todos os listadosr
; portanto, se os retângulos de entrada colocarem um retângulo grande em mosaico, esse retângulo grande deverá serm
.A linha 3 define a função
b
que, quando aplicada a um quádruplo representando um retângulo, produz uma função de duas variáveisx
ey
que é igual a 1 se o ponto(x,y)
estiver dentro do retângulo e 0 se não estiver. A linha 5 produz muitas dessas funções, uma para cada retângulo emr
(todas adicionadas juntas) e uma última para o retângulo grandem
(subtraído); essa complicada função de duas variáveis é então ao quadrado.A chave, neste ponto, é que essa função de duas variáveis seja identicamente 0 se os retângulos pequenos estiverem lado a lado com o retângulo grande, mas terá alguns valores positivos se dois retângulos pequenos se sobreporem, ou alguns valores negativos (antes do quadrado) se alguma parte do retângulo grande não está coberto. Detectamos isso integrando literalmente (!) A função de duas variáveis sobre o retângulo grande (os limites de integração são apresentados nas linhas 6-7): se obtivermos 0, o lado a lado foi perfeito e se obtivermos um valor positivo , houve um problema em algum lugar. Como tudo à vista é um número inteiro, salvamos um byte final usando em
< 1
vez da== 0
linha 8.(Eu acho bastante divertido podermos explorar a capacidade do Mathematica de fazer cálculos para resolver esse problema combinatório.)
fonte