Cubiertas rectangulares
Supongamos que tiene una matriz de bits, por ejemplo, la siguiente.
1 1 0 0 0 1 1 0
1 1 1 1 0 1 1 1
0 1 1 1 0 1 1 1
1 1 0 1 1 1 1 0
1 1 0 1 1 1 0 1
Nos gustaría encontrar una cubierta rectangular para esta matriz. Es un conjunto de subconjuntos rectangulares de la matriz que no contienen ningún 0, pero juntos contienen todos los 1. No se requiere que los subconjuntos sean disjuntos. Aquí hay un ejemplo de una cubierta rectangular para la matriz anterior.
+----+ +----+
|1 1| 0 0 0 |1 1| 0
| | | |
| +-|-----+ | |+-+
|1 |1| 1 1| 0 |1 1||1|
+----+ | | || |
| | | || |
0 |1 1 1| 0 |1 1||1|
+-------+ | |+-+
+----+ +-----|-+ |
|1 1| 0 |1 1 |1| 1| 0
| | | +----+
| | | | +-+
|1 1| 0 |1 1 1| 0 |1|
+----+ +-------+ +-+
El número de rectángulos en esta portada es 7.
La tarea
Su entrada es una matriz rectangular de bits, tomada en cualquier formato razonable. Puede suponer que contiene al menos uno 1. Su salida es el número mínimo de rectángulos en una cubierta rectangular de la matriz.
El conteo de bytes más bajo gana. Aplican reglas estándar de código de golf .
Casos de prueba
[[1]] -> 1
[[1,1]] -> 1
[[1],[1]] -> 1
[[1,0,1]] -> 2
[[1,0],[0,0]] -> 1
[[1,0],[0,1]] -> 2
[[1,0],[1,1]] -> 2
[[1,1,1],[1,0,1]] -> 3
[[0,1,0],[1,1,1],[0,1,0]] -> 2
[[1,1,1],[1,0,1],[1,1,1]] -> 4
[[1,1,0],[1,1,1],[0,1,1]] -> 2
[[1,0,1,0],[1,1,1,1],[1,0,1,0]] -> 3
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,0,1,0]] -> 4
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,0,1,1]] -> 5
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,1,1,1]] -> 4
[[1,1,0,0],[1,1,1,0],[0,1,1,1],[0,0,1,1]] -> 3
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]] -> 4
[[0,0,1,0,0],[0,1,1,1,0],[1,1,1,1,1],[0,1,1,1,0],[0,0,1,0,0]] -> 3
code-golf
matrix
optimization
Zgarb
fuente
fuente
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]]
4.Respuestas:
Python 2 ,
318315271 bytesMr.Xcoder, ovs y Jonathan Frech ahorraron muchos bytes
Pruébalo en línea!
fuente
Jalea ,
2524 bytesPruébalo en línea! Una solución típica de complejidad de golf, ni siquiera se moleste con casos de prueba más grandes, se agotarán (se inspecciona el conjunto de potencia de todos los rectángulos posibles *)
¿Cómo?
Forma todos los rectángulos posibles que se pueden hacer. Toma el conjunto de potencia de esos rectángulos y los inspecciona solo manteniendo esos conjuntos que no contienen ceros y contienen cada uno de ellos al menos una vez.
Para lograr la parte de "mantener esos conjuntos que no contienen ceros y contienen cada uno de ellos al menos una vez", el código primero obliga a los conjuntos a un conjunto de enteros distintos mayores que uno, dejando los ceros como están para que se convierta en " encontrar los máximos del producto de los valores únicos ".
* Para una matriz n por m , eso es maneras (n, m) = 2 ^ (T (n) × T (m)) , entonces ...
formas (3,2) = 2 ^ ((3 + 2 + 1) × (2 + 1)) = 2 ^ 18 = 262,144 (el enlace TIO)
formas (3,3) = 2 ^ ((3 + 2 + 1) × (3 + 2 + 1)) = 2 ^ 36 = 68,719,476,736
vías (3,4) = 2 ^ ((3 + 2 + 1) × (4 + 3 + 2 + 1)) = 2 ^ 60 = 1,152,921,504,606,846,976
vías (5,5) = 2 ^ 225 ~ = 5.4e + 67 (el caso de prueba más grande)
formas (8,5) = 2 ^ 540 ~ = 3.6e + 162 (el ejemplo)
fuente
FJṁ×⁸ẆZ€Ẇ€ẎŒPFQS$$ÐṀL€Ṃ
Funcionaría para -1? No hay tiempo para probar rn.1
tendría el mismo producto que una cobertura válida (por ejemplo, gire el ejemplo de ocho por cinco media vuelta y (en teoría) regresaría,6
ya que no cubriría la parte superior -célula izquierda y considérelo válido.)[[1,0],[0,1]]
volvería en1
lugar de hacerlo2
.JavaScript, 434 bytes
Código:
Hexdump (debido a caracteres no imprimibles):
Pruébalo en línea!
No es muy golfístico, pero al menos funciona muy rápido. Todos los casos de prueba se pueden calcular en pocos milisegundos.
Sin golf
Explicación
Utiliza un algoritmo similar como para resolver mapas de Karnaugh. En primer lugar, trata de encontrar al menos uno
1
que pueda ser parte de exactamente un rectángulo no extensible. Por no extensible quiero decir que si lo extendemos en cualquier dirección (arriba, izquierda, derecha, abajo) incluirá al menos uno0
(o irá más allá de los límites de la matriz). Cuando1
se encuentre tal, encuentre el rectángulo más grande que lo incluya y marque todos los1
s en ese rectángulo. Repita hasta que no haya más mensajes no marcados1
que satisfagan estas condiciones.En algunos casos (como en el 16º caso de prueba)
1
quedan sobrantes después de aplicar el primer paso. Luego enumere todos estos1
mensajes y aplique algún tipo de búsqueda mejorada de fuerza bruta. Este paso rara vez se aplica, e incluso en estos casos, necesitamos verificar la fuerza bruta solo una o dos combinaciones, por lo que debería funcionar muy rápido incluso para casos de prueba más grandes.fuente