Bitişik alt matrisleri sayma


12

Sohbetten taşındı

İki boş olmayan negatif olmayan bir tamsayı matrisler göz önüne alındığında, bir ve B , kaç kez yanıt bir bir şekilde meydana gelir , bitişik, muhtemelen üst üste, submatrix içinde B .

Örnekler / Kurallar

0. Herhangi bir alt matris olmayabilir

A :
[[3,1],
[1,4]]

B :
[[1,4],
[3,1]]

Cevap:
0

1. Alt matrisler bitişik olmalıdır

A :
[[1,4],
[3,1]]

B :
[[3,1,4,0,5],
[6,3,1,0,4],
[5,6,3,0,1]]

Yanıt:
1(kalın olarak işaretlenmiştir)

2. Alt matrisler çakışabilir

A :
[[1,4],
[3,1]]

B :
[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]

Cevap:
2(sırasıyla kalın ve italik olarak işaretlenmiştir)

3. Bir (alt) matris 1'e 1 ebat ve üstü olabilir

A :
[[3]]

B :
[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]

Yanıt:
3(kalın olarak işaretlenmiştir)

4. Matrisler herhangi bir şekil olabilir

A :
[[3,1,3]]

[[3,1,3,1,3,1,3,1,3]]

Cevap:
4(iki kalın, iki italik)

Yanıtlar:


6

Brachylog (v2), 10 bayt

{{s\s\}ᵈ}ᶜ

Çevrimiçi deneyin!

Bu programın Brachylog'da ne kadar açık ve anlaşılır olduğunu seviyorum; ne yazık ki, bu kısa byte-akıllıca değildir çünkü metaforik sözdizimi üç bayt alır ve bu programda iki kez kullanılması gerekir.

açıklama

{{s\s\}ᵈ}ᶜ
  s         Contiguous subset of rows
   \s\      Contiguous subset of columns (i.e. transpose, subset rows, transpose)
 {    }ᵈ    The operation above transforms the first input to the second input
{       }ᶜ  Count the number of ways in which this is possible

5

Jöle , 7 bayt

ZẆ$⁺€Ẏċ

Çevrimiçi deneyin!

Nasıl çalışır

ZẆ$⁺€Ẏċ  Main link. Arguments: B, A

  $      Combine the two links to the left into a monadic chain.
Z          Zip; transpose the matrix.
 Ẇ         Window; yield all contiguous subarrays of rows.
   ⁺     Duplicate the previous link chain.
    €    Map it over the result of applying it to B.
         This generates all contiguous submatrices of B, grouped by the selected
         columns of B.
     Ẏ   Tighten; dump all generated submatrices in a single array.
      ċ  Count the occurrences of A.

4

MATL , 12 bayt

ZyYC2MX:=XAs

Girişler önce A sonra B'dir .

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

Girişlerini düşünün [1,4; 3 1], [3,1,4,5; 6,3,1,4; 5,6,3,1]. Yığın aşağıdaki en yeni öğeyle gösterilir.

Zy    % Implicit input: A. Push size as a vector of two numbers
      % STACK: [2 2]
YC    % Implicit input: B. Arrange sliding blocks of specified size as columns,
      % in column-major order
      % STACK: [3 6 1 3 4 1;
                6 5 3 6 1 3;
                1 3 4 1 5 4;
                3 6 1 3 4 1]
2M    % Push input to second to last function again; that is, A
      % STACK: [3 6 1 3 4 1;
                6 5 3 6 1 3;
                1 3 4 1 5 4;
                3 6 1 3 4 1],
               [1 4;
                3 1]                    
X:    % Linearize to a column vector, in column-major order
      % STACK: [3 6 1 3 4 1;
                6 5 3 6 1 3;
                1 3 4 1 5 4;
                3 6 1 3 4 1],
               [1;
                3;
                4;
                1]  
=     % Test for equality, element-wise with broadcast
      % STACK: [0 0 1 0 0 1
                0 0 1 0 0 1;
                0 0 1 0 0 1;
                0 0 1 0 0 1]
XA    % True for columns containing all true values
      % STACK: [0 0 1 0 0 1]
s     % Sum. Implicit display
      % STACK: 2

2

05AB1E , 10 bayt

øŒεøŒI.¢}O

Çevrimiçi deneyin!

øŒεøŒI.¢}O     Full program. Takes 2 matrices as input. First B, then A.
øŒ             For each column of B, take all its sublists.
  ε     }      And map a function through all those lists of sublists.
   øŒ          Transpose the list and again generate all its sublists.
               This essentially computes all sub-matrices of B.
     I.¢       In the current collection of sub-matrices, count the occurrences of A.
         O     At the end of the loop sum the results.

2

Dyalog APL, 6 4 bayt

≢∘⍸⍷

Bu neredeyse bir yapıdır (teşekkürler H.PWiz ve ngn ).

  ⍷       Binary matrix containing locations of left argument in right argument
≢∘⍸       Size of the array of indices of 1s

Alternatif yerleşik olmayan:

{+/,((*⍺)≡⊢)⌺(⍴⍺)*⍵}

Sağdaki büyük diziyi, soldaki alt diziyi alan ikili işlev.

                  *⍵       exp(⍵), to make ⍵ positive.
    ((*⍺)≡⊢)⌺(⍴⍺)        Stencil;
                            all subarrays of ⍵ (plus some partial subarrays
                            containing 0, which we can ignore)
               ⍴⍺             of same shape as ⍺
     (*⍺)≡⊢                   processed by checking whether they're equal to exp(⍺).
                           Result is a matrix of 0/1.
   ,                     Flatten
 +/                      Sum.

Burada deneyin .


Ödeme yapmalısınız
H.PWiz

Eğer oluşturma deneyimini (kullanabilirsiniz : dizisini kısaltmak amacıyla) +/∘∊⍷bile ya≢∘⍸⍷
ngn

1

JavaScript (ES6), 93 bayt

Girişi alır (A)(B).

a=>b=>b.map((r,y)=>r.map((_,x)=>s+=!a.some((R,Y)=>R.some((v,X)=>v!=(b[y+Y]||0)[x+X]))),s=0)|s

Çevrimiçi deneyin!





1

Odun kömürü , 36 27 bayt

IΣ⭆η⭆ι⁼θE✂ηκ⁺Lθκ¹✂νμ⁺L§θ⁰μ¹

Çevrimiçi deneyin! Eşittir şimdi diziler için çalışıyor çok daha kısa. Açıklama:

   η                        Input array B
  ⭆                         Mapped over rows and joined
     ι                      Current row
    ⭆                       Mapped over columns and joined
       θ                    Input array A
      ⁼                     Is equal to
          η                 Input array B
         ✂                  Sliced
                ¹           All elements from
           κ                Current row index to
             L              Length of
              θ             Input array A
            ⁺               Plus
               κ            Current row index
        E                   Mapped over rows
                  ν         Current inner row
                 ✂          Sliced
                          ¹ All elements from
                   μ        Current column index to
                     L      Length of
                       θ    Input array A
                      §     Indexed by
                        ⁰   Literal 0
                    ⁺       Plus
                         μ  Current column index
 Σ                          Digital sum
I                           Cast to string
                            Implicitly printed

0

Python 2 , 211 bayt

a,b=input()
l,w,L,W,c=len(a),len(a[0]),len(b),len(b[0]),0
for i in range(L):
 for j in range(W):
  if j<=W-w and i<=L-l:
   if not sum([a[x][y]!=b[i+x][j+y]for x in range(l)for y in range(w)]):
    c+=1
print c 

Çevrimiçi deneyin!

Yeterince açıksözlü. Daha büyük matriste adım atın ve daha küçük matrisin uygun olup olmadığını kontrol edin.

Biraz zor olan tek adım, 6. satırdaki Python'un Boole ve tamsayı aritmetiğini karıştırma konvansiyonlarına dayanan liste kavrayışıdı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.