Rechteckabdeckungen
Angenommen, Sie haben eine Bitmatrix, zum Beispiel die folgende.
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
Wir möchten für diese Matrix eine rechteckige Abdeckung finden . Es ist eine Menge von rechteckigen Teilmengen der Matrix, die keine Nullen enthalten, aber zusammen alle Einsen enthalten. Die Teilmengen müssen nicht disjunkt sein. Hier ist ein Beispiel einer rechteckigen Abdeckung für die obige Matrix.
+----+ +----+
|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|
+----+ +-------+ +-+
Die Anzahl der Rechtecke in diesem Cover beträgt 7.
Die Aufgabe
Ihre Eingabe ist eine rechteckige Bitmatrix in einem beliebigen Format. Sie können davon ausgehen, dass es mindestens eine 1 enthält. Ihre Ausgabe ist die Mindestanzahl von Rechtecken in einer Rechteckabdeckung der Matrix.
Die niedrigste Byteanzahl gewinnt. Es gelten die Standardregeln für Code-Golf .
Testfälle
[[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
quelle
quelle
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]]
Antworten:
Python 2 ,
318315271 BytesMr.Xcoder, ovs und Jonathan Frech haben eine Menge Bytes gespart
Probieren Sie es online!
quelle
Jelly ,
2524 BytesProbieren Sie es online! Eine typische Golf-Komplexitätslösung, die sich nicht einmal um größere Testfälle kümmert, da sie eine Zeitüberschreitung verursachen (die Potenz aller möglichen Rechtecke wird überprüft *).
Wie?
Bildet alle möglichen Rechtecke, die erstellt werden können. Nimmt die Potenzmenge dieser Rechtecke und prüft sie, wobei nur die Mengen beibehalten werden, die beide keine Nullen und jede der Einsen mindestens einmal enthalten.
Um zu erreichen, dass "die Mengen beibehalten werden, die beide keine Nullen enthalten und jede der Einsen mindestens einmal enthalten", werden die Einsen durch den Code zunächst zu einer Menge eindeutiger Ganzzahlen zusammengesetzt, die größer als Eins sind, wobei die Nullen so belassen werden, wie sie sind, dass sie werden ". Finden der Maxima des Produkts aus den eindeutigen Werten ".
* Für eine Matrix von n mal m sind Wege (n, m) = 2 ^ (T (n) × T (m)) , also ...
Wege (3,2) = 2 ^ ((3 + 2 + 1) × (2 + 1)) = 2 ^ 18 = 262,144 (die TIO-Verbindung)
Wege (3,3) = 2 ^ ((3 + 2 + 1) × (3 + 2 + 1)) = 2 ^ 36 = 68,719,476,736
Wege (3,4) = 2 ^ ((3 + 2 + 1) × (4 + 3 + 2 + 1)) = 2 ^ 60 = 1.152.921.504.606.846.976
Wege (5,5) = 2 ^ 225 ~ = 5,4e + 67 (der größte Testfall)
Wege (8,5) = 2 ^ 540 ~ = 3,6e + 162 (das Beispiel)
quelle
FJṁ×⁸ẆZ€Ẇ€ẎŒPFQS$$ÐṀL€Ṃ
für -1 arbeiten? Keine Zeit rn zu testen.1
hätte das gleiche Produkt wie eine gültige Abdeckung (z. B. die Acht mal fünf, eine halbe Umdrehung) und würde (theoretisch) zurückkehren,6
da es vernachlässigt würde, die Oberseite zu bedecken -Linkszelle und halte es für gültig.)[[1,0],[0,1]]
käme1
eher zurück als2
.JavaScript, 434 Bytes
Code:
Hexdump (wegen nicht druckbarer Zeichen):
Probieren Sie es online!
Es ist nicht sehr golfig, aber es funktioniert zumindest sehr schnell. Alle Testfälle können in wenigen Millisekunden berechnet werden.
Ungolfed
Erläuterung
Es verwendet einen ähnlichen Algorithmus wie zum Lösen von Karnaugh-Karten. Zunächst wird versucht, mindestens eines zu
1
finden, das Teil genau eines nicht erweiterbaren Rechtecks sein kann. Mit nicht erweiterbar meine ich, wenn wir es in eine beliebige Richtung (nach oben, links, rechts, unten) erweitern, wird es mindestens eine enthalten0
(oder wird über die Matrixgrenzen hinausgehen). Wenn dies1
gefunden wird, suchen Sie das größte Rechteck, das es enthält, und markieren Sie alle1
s in diesem Rechteck. Wiederholen, bis keine nicht markierten mehr vorhanden sind1
s mehr vorhanden sind, die diese Bedingungen erfüllen.In einigen Fällen (wie im 16. Testfall) sind
1
nach der Anwendung des ersten Schritts noch s übrig. Führen Sie dann alle diese1
s auf und wenden Sie eine Art erweiterte Brute-Force-Suche an. Dieser Schritt wird selten angewendet, und selbst in diesen Fällen müssen wir nur eine oder zwei Kombinationen einer Brute-Force-Prüfung unterziehen, sodass er auch bei größeren Testfällen sehr schnell funktionieren sollte.quelle