Couvertures rectangulaires
Supposons que vous ayez une matrice de bits, par exemple la suivante.
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
Nous aimerions trouver une couverture rectangulaire pour cette matrice. Il s'agit d'un ensemble de sous-ensembles rectangulaires de la matrice qui ne contiennent aucun 0, mais qui contiennent ensemble tous les 1. Il n'est pas nécessaire que les sous-ensembles soient disjoints. Voici un exemple de couverture rectangulaire pour la matrice ci-dessus.
+----+ +----+
|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|
+----+ +-------+ +-+
Le nombre de rectangles dans cette couverture est de 7.
La tâche
Votre entrée est une matrice rectangulaire de bits, prise dans n'importe quel format raisonnable. Vous pouvez supposer qu'il contient au moins un 1. Votre sortie est le nombre minimum de rectangles dans un rectangle de couverture de la matrice.
Le nombre d'octets le plus bas gagne. Les règles de code-golf standard s'appliquent.
Cas de test
[[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
la source
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]]
Réponses:
Python 2 ,
318315271 octetsMr.Xcoder, ovs et Jonathan Frech ont économisé beaucoup d'octets
Essayez-le en ligne!
la source
Gelée ,
2524 octetsEssayez-le en ligne! Une solution de complexité de golf typique, ne vous embêtez même pas avec des cas de test plus grands, ils expireront (l'ensemble de puissance de tous les rectangles possibles est inspecté *)
Comment?
Forme tous les rectangles possibles qui peuvent être créés. Prend le jeu de puissance de ces rectangles et les inspecte en ne gardant que les jeux qui ne contiennent pas de zéros et contiennent chacun de ceux au moins une fois.
Pour obtenir la partie "conserver les ensembles qui ne contiennent pas de zéros et contiennent chacun de ceux au moins une fois", le code contraint d'abord ceux-ci à un ensemble d'entiers distincts supérieurs à un, en laissant les zéros tels quels afin qu'ils deviennent " trouver les maxima du produit des valeurs uniques ".
* Pour une matrice n par m , c'est-à-dire voies (n, m) = 2 ^ (T (n) × T (m)) , donc ...
voies (3,2) = 2 ^ ((3 + 2 + 1) × (2 + 1)) = 2 ^ 18 = 262.144 (le lien TIO)
(3,3) = 2 ^ ((3 + 2 + 1) × (3 + 2 + 1)) = 2 ^ 36 = 68,719,476,736
voies (3,4) = 2 ^ ((3 + 2 + 1) × (4 + 3 + 2 + 1)) = 2 ^ 60 = 1,152,921,504,606,846,976
voies (5,5) = 2 ^ 225 ~ = 5.4e + 67 (le plus grand cas de test)
voies (8,5) = 2 ^ 540 ~ = 3,6e + 162 (l'exemple)
la source
FJṁ×⁸ẆZ€Ẇ€ẎŒPFQS$$ÐṀL€Ṃ
pour -1? Pas le temps de tester rn.1
aurait le même produit qu'une couverture valide (par exemple, tournez l'exemple de huit par cinq d'un demi-tour et elle reviendrait (en théorie)6
car elle négligerait de couvrir le haut cellule gauche et la considérer comme valide.)[[1,0],[0,1]]
reviendrait1
plutôt que2
.JavaScript, 434 octets
Code:
Hexdump (en raison de caractères non imprimables):
Essayez-le en ligne!
Ce n'est pas très golfique, mais au moins ça marche très vite. Tous les cas de test peuvent être calculés en quelques millisecondes.
Non golfé
Explication
Il utilise un algorithme similaire comme pour la résolution des cartes de Karnaugh. Premièrement, il essaie d'en trouver au moins un
1
qui peut faire partie d'exactement un rectangle non extensible. Par non extensible, je veux dire que si nous l'étendons dans n'importe quelle direction (haut, gauche, droite, bas), elle en inclura au moins une0
(ou dépassera les limites de la matrice). Une fois1
trouvé, trouvez le plus grand rectangle qui l'inclut et marquez tous les1
s dans ce rectangle. Répétez jusqu'à ce qu'il n'y ait plus de s non marqués1
qui remplissent ces conditions.Dans certains cas (comme dans le 16e cas de test), il reste des
1
s après l'application de la première étape. Énumérer ensuite tous ces1
s et appliquer une sorte de recherche améliorée par force brute. Cette étape est rarement appliquée, et même dans ces cas, nous devons vérifier la force brute uniquement une ou deux combinaisons, donc cela devrait fonctionner très rapidement même pour les cas de test plus volumineux.la source