2B bayt dizisindeki dikdörtgen sayısını bulma


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

Size mx n boyutunda 2 boyutlu bayt dizisi verilir. Tüm baytların 1 veya 0 olduğu garanti edilir. Yukarıda gösterildiği gibi, 2d'de görüntülendiğinde 1'lerin temsil ettiği dikdörtgen sayısını bulun.

Sadece tam olarak doldurulmuş dikdörtgenler sayma için dikkate alınır.
Dikdörtgenler kenarlarında olmadıkça 0'larla çevrelenmelidir (1'in çapraz dokunan dikdörtgenleri olsa da iyidir (örneğe bakın)).

Örneğin, yukarıdaki dizide 5 geçerli dikdörtgen vardır.

Herhangi bir dili kullanabilirsiniz.


1
Ben bunu söylemek için daha iyi bir yol olduğunu söylemek için: dikdörtgenler 0 veya kenar ile çevrili olmalıdır
Cruncher

Bitti. Daha iyi bir İngilizce ifade ettiğiniz için teşekkürler.
microbian

Ne olmuş 1100\n1100\n0011\n0011?
Cruncher

1
Sanırım bu yüzden 'bitişik / örtüşen' yazdım. Bunlar benim ilk niyetimden 2 geçerli dikdörtgen. Fakat 'çevreleyen' durum şimdi onları kısıtlıyor. Açıklamak için daha iyi bir yol var mı
microbian

1
Bitişik olsa bile, diyagonalin bitişik olup olmadığı belirsizdir. Aynı belirsizlik, kuşatılmış olsun olmasın, köşelerde veya sadece yanlarda çevrelenmiş demektir
Cruncher

Yanıtlar:


2

GolfScript, 107 karakter

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

Giriş STDIN'de verilmelidir.

Örnekler:

11
01
-
0

111
111
-
1

100
001
001
-
2

11100
10101
11100
-
1

101
010
101
-
5

Yukarıdaki yorumlara bakın - "geçerli" dikdörtgenlerin her ikisinin de genişlik / yüksekliğe sahip olması gerektiği anlaşılıyor> 1.
Paul R

@PaulR Bu kural soruda yazılmamış, tüm bunlar kusursuz ince dikdörtgenler olan tüm makul tanımlarla - belki daha sonra ekleyeceğim.
Howard

Tanımınıza katılıyorum - yorumlardaki tutarsızlığa dikkat çekiyordum - OP'nin soruyu daha kesin hale getirmek için güncellemesi gerekiyor gibi görünüyor.
Paul R

1 boyutlu dikdörtgenin geçerli olduğunu açıkladım.
microbian

Ancak yorumlarda da şunları söylediniz: "Sadece açıklama amacıyla, dejenere dikdörtgenler sayılmamalı, doğru mu? Örneğin, tek bir 1 veya tek bir alt sıra / bitişik 1'in alt sütunu geçersiz mi?" "Evet, geçersiz ve sayılmamalıdır" diyerek.
Paul R
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.