Znajdź liczbę prostokątów w tablicy bajtów 2D


12
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000111111000000000000000000011111111111111100000000000000000
0000000000000100001000000111111000000011111111111111100000000010000000
0000000000000100001000000111111000000000000000000000011000000000000000
0000000000000111111000000111111000000000000000000000011000000000000000
0000000000000000000000000000111111000000000000000000000000000000000000
0000000000000000000000000000111111000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000

Otrzymujesz 2-wymiarową tablicę bajtów o rozmiarze mx n. Gwarantujemy, że wszystkie bajty to 1 lub 0. Znajdź liczbę prostokątów reprezentowanych przez 1 w widoku 2d, jak pokazano powyżej.

Do zliczania brane są pod uwagę tylko w pełni wypełnione prostokąty.
Prostokąty muszą być otoczone zerami, chyba że znajdują się na krawędzi (prostokąty 1 dotykające ukośne są w porządku (patrz przykład.)).

Na przykład w powyższej tablicy znajduje się 5 prawidłowych prostokątów.

Możesz używać dowolnego języka.


1
Myślę, że lepszym sposobem na wyrażenie tego jest powiedzenie: prostokąty muszą być otoczone
zerami

Gotowy. Dzięki za sformułowanie go w lepszym angielskim.
mikrobiolog

Co 1100\n1100\n0011\n0011?
Cruncher

1
Myślę, że dlatego napisałem „sąsiadujące / nakładające się”. Są to 2 prawidłowe prostokąty z mojej pierwotnej intencji. Ale warunki „otaczające” je teraz ograniczają. Czy masz lepszy sposób, aby to wyjaśnić
mikrobian

1
Nawet w sąsiedztwie nie jest jednoznaczne, czy przekątna oznacza sąsiedztwo, czy nie. Ta sama dwuznaczność, niezależnie od tego, czy jest otoczona, czy też nie, oznacza w narożnikach lub po bokach
Cruncher

Odpowiedzi:


2

GolfScript, 107 znaków

.n?):L;'1'/{,}%{1$+)}*;][]\{:A{{+}+[1L.~)-1]%&}+1$\,.@^\[[[A]]+{|}*]+}/{.{L%}{%$..&1$,1$,/*$=}:C~\{L/}C&},,

Dane wejściowe należy podać na STDIN.

Przykłady:

11
01
-
0

111
111
-
1

100
001
001
-
2

11100
10101
11100
-
1

101
010
101
-
5

Patrz komentarze powyżej - wydaje się, że „prawidłowe” prostokąty muszą mieć szerokość / wysokość zarówno> 1.
Paul R

@PaulR Ta zasada nie jest zapisana w pytaniu, przy wszystkich rozsądnych definicjach są to idealnie drobne prostokąty - może dodam to później.
Howard

Zgadzam się z twoją definicją - właśnie zauważyłem rozbieżność w komentarzach - wygląda na to, że OP musi zaktualizować pytanie, aby było bardziej ostateczne.
Paul R

Wyjaśniłem, że prostokąt o rozmiarze 1 jest prawidłowy.
mikrobiolog

Ale powiedziałeś również w komentarzach w odpowiedzi na: „Dla wyjaśnienia, zdegenerowane prostokąty nie powinny być liczone, prawda? Na przykład, czy jeden 1 lub pojedynczy subrow / subkolumna sąsiednich 1 jest nieważna?” mówiąc: „Tak, są one nieważne i nie należy ich liczyć”.
Paul R
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.