Capas retangulares
Suponha que você tenha uma matriz de bits, por exemplo, o seguinte.
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
Gostaríamos de encontrar uma cobertura retangular para essa matriz. É um conjunto de subconjuntos retangulares da matriz que não contêm 0s, mas juntos contêm todos os 1s. Os subconjuntos não precisam ser separados. Aqui está um exemplo de uma cobertura retangular para a matriz acima.
+----+ +----+
|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|
+----+ +-------+ +-+
O número de retângulos nesta capa é 7.
A tarefa
Sua entrada é uma matriz retangular de bits, obtida em qualquer formato razoável. Você pode assumir que ele contém pelo menos um 1. Sua saída é o número mínimo de retângulos em uma tampa retangular da matriz.
A menor contagem de bytes vence. Aplicam-se as regras padrão de código de golfe .
Casos de teste
[[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
fonte
fonte
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]]
Respostas:
Python 2 ,
318315271 bytesMr.Xcoder, ovs e Jonathan Frech economizaram muitos bytes
Experimente online!
fonte
Geléia ,
2524 bytesExperimente online! Uma solução típica de complexidade do golfe, nem se preocupa com casos de teste maiores, eles expiram (o conjunto de potência de todos os retângulos possíveis é inspecionado *)
Quão?
Forma todos os retângulos possíveis que podem ser feitos. Toma o conjunto de potência desses retângulos e os inspeciona apenas mantendo aqueles conjuntos que não contêm zeros e contêm cada um deles pelo menos uma vez.
Para obter a parte "mantendo os conjuntos que não contêm zeros e contêm cada um deles pelo menos uma vez", o código primeiro coage esses para um conjunto de números inteiros distintos maior que um, deixando os zeros como estão para que se tornem " encontrar os máximos do produto dos valores únicos ".
* Para uma matriz n por m , são as maneiras (n, m) = 2 ^ (T (n) × T (m)) , então ...
maneiras (3,2) = 2 ^ ((3 + 2 + 1) × (2 + 1)) = 2 ^ 18 = 262.144 (o link do TIO)
maneiras (3,3) = 2 ^ ((3 + 2 + 1) × (3 + 2 + 1)) = 2 ^ 36 = 68.719.476.736
A
soma de dois números naturais é o mesmo que o número 1. (o maior caso de teste)
maneiras (8,5) = 2 ^ 540 ~ = 3.6e + 162 (o exemplo)
fonte
FJṁ×⁸ẆZ€Ẇ€ẎŒPFQS$$ÐṀL€Ṃ
trabalhar para -1? Não há tempo para testar rn.1
teria o mesmo produto que uma capa válida (por exemplo, gire o exemplo de oito por cinco por meia volta e (em teoria) retornaria6
, pois negligenciaria cobrir a parte superior celular Setas Esquerda e considerá-lo válido).[[1,0],[0,1]]
retornaria em1
vez de2
.JavaScript, 434 bytes
Código:
Hexdump (devido a caracteres não imprimíveis):
Experimente online!
Não é muito golfe, mas pelo menos funciona muito rápido. Todos os casos de teste podem ser calculados em alguns milissegundos.
Ungolfed
Explicação
Ele usa algoritmo semelhante ao da resolução de mapas de Karnaugh. Primeiramente, ele tenta encontrar pelo menos um
1
que possa fazer parte de exatamente um retângulo não extensível. Por não extensível, quero dizer, se o estendermos em qualquer direção (para cima, esquerda, direita, baixo), ele incluirá pelo menos um0
(ou irá além dos limites da matriz). Quando isso1
for encontrado, encontre o maior retângulo que o inclui e sinalize todos os1
s nesse retângulo. Repita até que não haja mais1
s não sinalizados que atendam a essas condições.Em alguns casos (como no 16º caso de teste), existem
1
s que sobraram após a aplicação da primeira etapa. Enumere todos estes se1
aplique algum tipo de pesquisa aprimorada de força bruta. Essa etapa raramente é aplicada e, mesmo nesses casos, precisamos verificar a força bruta apenas uma ou duas combinações, para que funcione muito rápido, mesmo em casos de teste maiores.fonte