Osłony prostokątne
Załóżmy, że masz macierz bitów, na przykład następujące.
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
Chcielibyśmy znaleźć prostokątną osłonę dla tej matrycy. Jest to zestaw prostokątnych podzbiorów macierzy, które nie zawierają żadnych zer, ale razem zawierają wszystkie jedynki. Podzbiory nie muszą być rozłączne. Oto przykład prostokątnej pokrywy dla powyższej matrycy.
+----+ +----+
|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|
+----+ +-------+ +-+
Liczba prostokątów w tej okładce wynosi 7.
Zadanie
Twój wkład to prostokątna matryca bitów, wykonana w dowolnym rozsądnym formacie. Możesz założyć, że zawiera co najmniej jeden 1. Twój wynik to minimalna liczba prostokątów w prostokątnej pokrywie matrycy.
Wygrywa najniższa liczba bajtów. Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
[[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
źródło
źródło
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]]
Odpowiedzi:
Python 2 ,
318315271 bajtówMr.Xcoder, ovs i Jonathan Frech zaoszczędzili wiele bajtów
Wypróbuj online!
źródło
Galaretka ,
2524 bajtówWypróbuj online! Typowe rozwiązanie o złożoności golfowej, nawet nie zawracaj sobie głowy większymi przypadkami testowymi, przekroczą limit czasu (sprawdzany jest zestaw mocy wszystkich możliwych prostokątów *)
W jaki sposób?
Tworzy wszystkie możliwe prostokąty, które można wykonać. Pobiera zestaw mocy tych prostokątów i sprawdza je, zachowując tylko te zestawy, które nie zawierają zer i zawierają przynajmniej jeden z nich.
Aby osiągnąć „zachowanie tych zbiorów, które oba nie zawierają zer i które zawierają przynajmniej jeden z nich”, kod najpierw wymusza je na zestawie odrębnych liczb całkowitych większych niż jeden, pozostawiając zera takimi, jakimi są, aby stał się „ znajdowanie maksimów iloczynu unikalnych wartości ".
* Dla macierzy n na m , czyli sposobów (n, m) = 2 ^ (T (n) × T (m)) , więc ...
sposoby (3,2) = 2 ^ ((3 + 2 + 1) × (2 + 1)) = 2 ^ 18 = 262,144 (łącze TIO)
sposoby (3,3) = 2 ^ ((3 + 2 + 1) × (3 + 2 + 1)) = 2 ^ 36 = 68 739 476,736
sposoby (3,4) = 2 ^ ((3 + 2 + 1) × (4 + 3 + 2 + 1)) = 2 ^ 60 = 1,152,921,504,606,846,976
sposoby (5,5) = 2 ^ 225 ~ = 5,4e + 67 (największy przypadek testowy)
sposoby (8,5) = 2 ^ 540 ~ = 3,6e + 162 (przykład)
źródło
FJṁ×⁸ẆZ€Ẇ€ẎŒPFQS$$ÐṀL€Ṃ
działałoby dla -1? Nie ma czasu na testowanie rn.1
miałaby ten sam produkt, co ważna okładka (np. Obrócić ósemkę o pięć przykładów o pół obrotu i powróciłaby (teoretycznie),6
gdyby nie pokryła góry - lewa komórka i uważaj ją za ważną.)[[1,0],[0,1]]
powróciłaby walizka testowa1
niż2
.JavaScript, 434 bajty
Kod:
Hexdump (z powodu znaków niedrukowalnych):
Wypróbuj online!
Nie jest bardzo golfowy, ale przynajmniej działa bardzo szybko. Wszystkie przypadki testowe można obliczyć w kilka milisekund.
Bez golfa
Wyjaśnienie
Używa podobnego algorytmu jak przy rozwiązywaniu map Karnaugh. Po pierwsze, próbuje znaleźć co najmniej jeden,
1
który może być częścią dokładnie jednego nierozciągliwego prostokąta. Przez nierozszerzalny rozumiem, jeśli rozciągniemy go w dowolnym kierunku (w górę, w lewo, w prawo, w dół), będzie on zawierał przynajmniej jeden0
(lub przekroczy granice macierzy). Kiedy taki1
zostanie znaleziony, znajdź największy prostokąt, który go zawiera i oznacz wszystkie1
s w tym prostokącie. Powtarzaj, aż nie będzie już żadnych nieoznaczonych flag,1
które spełniają te warunki.W niektórych przypadkach (jak w 16 przypadku testowym) pozostały takie,
1
które pozostały po zastosowaniu pierwszego kroku. Następnie wylicz wszystkie te1
i zastosuj jakieś ulepszone wyszukiwanie z użyciem siły brute. Ten krok jest rzadko stosowany, a nawet w tych przypadkach musimy sprawdzić brutalną siłę tylko jedną lub dwie kombinacje, więc powinien działać bardzo szybko, nawet w przypadku większych przypadków testowych.źródło