연속 된 부분 행렬 계산


12

채팅에서 이전

두 개의 비어 아닌 정수 행렬 주어 및 B는 , 횟수 응답 A가 A와 발생 인접 가능성 중첩 행렬B를 .

예 / 규칙

0. 하위 행렬이 없을 수 있습니다

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

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

대답:
0

1. 하위 행렬은 연속적이어야합니다

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

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

답 :
1(굵게 표시)

2. 하위 행렬이 겹칠 수 있습니다

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

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

답 :
2(각각 굵은 기울임 꼴로 표시)

3. (서브) 행렬의 크기는 1x1 이상일 수 있습니다.

A :
[[3]]

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

답 :
3(굵게 표시)

매트릭스는 임의의 형상 일 수있다

A :
[[3,1,3]]

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

답 :
4(굵은 체 2 개, 이탤릭체 2 개)

답변:


6

Brachylog (v2), 10 바이트

{{s\s\}ᵈ}ᶜ

온라인으로 사용해보십시오!

나는이 프로그램이 Brachylog에 얼마나 명확하고 솔직한 지 좋아합니다. 불행히도, 메타 술어 구문이 3 바이트를 차지하고이 프로그램에서 두 번 사용해야하기 때문에 바이트 단위로 짧지는 않습니다.

설명

{{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

젤리 , 7 바이트

ZẆ$⁺€Ẏċ

온라인으로 사용해보십시오!

작동 원리

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 바이트

ZyYC2MX:=XAs

입력 값은 A , B 입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

입력을 고려 [1,4; 3 1], [3,1,4,5; 6,3,1,4; 5,6,3,1]. 스택은 아래에 가장 최신 요소로 표시됩니다.

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 바이트

øŒεøŒI.¢}O

온라인으로 사용해보십시오!

øŒεøŒ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 바이트

≢∘⍸⍷

이것은 거의 내장되어 있습니다 ( H.PWizngn 덕분에 ).

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

내장 비 대체 :

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

오른쪽에는 큰 배열을, 왼쪽에는 하위 배열을 취하는 Dyadic 함수.

                  *⍵       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.

여기서 사용해보십시오 .


체크 아웃
H.PWiz

compose ( )를 사용 하여 기차를 단축 시키 +/∘∊⍷거나≢∘⍸⍷
ngn





1

, 36 27 바이트

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

온라인으로 사용해보십시오! Equals가 배열에서 다시 작동하므로 훨씬 짧아졌습니다. 설명:

   η                        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

파이썬 2 , 211 바이트

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 

온라인으로 사용해보십시오!

매우 간단합니다. 더 큰 행렬을 살펴보고 더 작은 행렬이 맞는지 확인하십시오.

약간 까다로운 단계는 6 번째 줄의 목록 이해뿐입니다.이 행은 부울과 정수 산술을 혼합하는 Python의 규칙에 의존합니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.