주어진 크기의 모든 제곱 하위 행렬 생성


14

정수 M 과 다른 양 의 정수의 제곱 행렬이 주어집니다. N 의 크기보다 확실히 작은 M을 . 당신의 임무는 크기가 nM 의 모든 제곱 하위 행렬을 생성하는 것 입니다.

이 과제를 위해, 정사각형 하위 행렬M에 포함 된 인접한 행과 열의 그룹입니다 .

입력 / 출력 형식

당신은 다른 합리적인 형식을 자유롭게 선택할 수 있습니다. 이것들은 단지 예일뿐입니다.

입력

  • 기본 매트릭스 유형의 매트릭스 (언어가있는 경우)
  • 2D 배열 (1D 배열의 배열, 각각 하나의 행 / 하나의 열에 해당)
  • 1D 배열 (매트릭스는 항상 정사각형이므로)
  • 문자열 (간격을 선택했지만 어떤 식 으로든 남용하지 마십시오) 등

산출

  • 행렬의 행렬.
  • 4D 배열. 여기서 각 요소 (3D 목록)는 행 / 열의 하위 행렬을 나타냅니다.
  • 3D 배열. 각 요소 (2D 목록)는 하위 행렬을 나타냅니다.
  • 결과 하위 행렬 등의 문자열 표현

명세서

  • 당신은 걸릴하도록 선택할 수 있습니다 크기M을 너무 입력으로. 2 이상이어야 합니다.
  • 출력 방향은 임의적입니다. 하위 행렬을 열 목록 또는 행 목록으로 출력하도록 선택할 수 있지만 선택은 일관성이 있어야합니다.
  • 모든 프로그래밍 언어로 경쟁 할 수 있으며 표준 방법을 통해 입력을 받고 출력을 제공 할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.
  • 이것은 이므로 모든 언어에 대한 가장 짧은 제출 (바이트)이 이깁니다.

주어진 n = 3M :

 12 34
 5 6 7 8
 9 10 11 12
13 14 15 16

가능한 3x3 하위 행렬은 다음과 같습니다.

+ ------- + + -------- + 1 2 3 4 1 2 3 4
| 12 3 | 4 1 | 2 3 4 | + -------- + + -------- +
| 5 6 7 | 8 5 | 6 7 8 | | 5 6 7 | 8 5 | 6 7 8 |
| 9 10 11 | 12 9 | 10 11 12 | | 9 10 11 | 12 9 | 10 11 12 |
+ ------- + + -------- + | 13 14 15 | 16 13 | 14 15 16 |
13 14 15 16 13 14 15 16 + -------- + + -------- +

결과는 다음과 같습니다.

[[[1, 2, 3], [5, 6, 7], [9, 10, 11]], [[2, 3, 4], [6, 7, 8], [10, 11, 12]], [[5, 6, 7], [9, 10, 11], [13, 14, 15]], [[6, 7, 8], [10, 11, 12], [14, 15, 16]]]

위에서 언급 한 바와 같이

[[[1, 5, 9], [2, 6, 10], [3, 7, 11]], [[2, 6, 10], [3, 7, 11], [4, 8, 12]], [[5, 9, 13], [6, 10, 14], [7, 11, 15]], [[6, 10, 14], [7, 11, 15], [8, 12, 16]]]

대신 하위 행렬을 행 목록으로 반환하도록 선택한 경우에도 허용됩니다.

테스트 사례

입력 M, n :

[[1,2,3],[5,6,7],[9,10,11]], 1
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], 3
[[100,-3,4,6],[12,11,14,8],[0,0,9,3],[34,289,-18,3]], 2
[[100,-3,4,6],[12,11,14,8],[9,10,11,12],[13,14,15,16]], 3

그리고 해당 출력 (행 목록으로 제공된 하위 행렬) :

[[[1]],[[2]],[[3]],[[5]],[[6]],[[7]],[[9]],[[10]],[[11]]]
[[[1,2,3],[5,6,7],[9,10,11]],[[2,3,4],[6,7,8],[10,11,12]],[[5,6,7],[9,10,11],[13,14,15]],[[6,7,8],[10,11,12],[14,15,16]]]
[[[100,-3],[12,11]],[[-3,4],[11,14]],[[4,6],[14,8]],[[12,11],[0,0]],[[11,14],[0,9]],[[14,8],[9,3]],[[0,0],[34,289]],[[0,9],[289,-18]],[[9,3],[-18,3]]]
[[[100,-3,4],[12,11,14],[9,10,11]],[[-3,4,6],[11,14,8],[10,11,12]],[[12,11,14],[9,10,11],[13,14,15]],[[11,14,8],[10,11,12],[14,15,16]]]

또는 열 목록으로 :

[[[1]],[[2]],[[3]],[[5]],[[6]],[[7]],[[9]],[[10]],[[11]]]
[[[1,5,9],[2,6,10],[3,7,11]],[[2,6,10],[3,7,11],[4,8,12]],[[5,9,13],[6,10,14],[7,11,15]],[[6,10,14],[7,11,15],[8,12,16]]]
[[[100,12],[-3,11]],[[-3,11],[4,14]],[[4,14],[6,8]],[[12,0],[11,0]],[[11,0],[14,9]],[[14,9],[8,3]],[[0,34],[0,289]],[[0,289],[9,-18]],[[9,-18],[3,3]]]
[[[100,12,9],[-3,11,10],[4,14,11]],[[-3,11,10],[4,14,11],[6,8,12]],[[12,9,13],[11,10,14],[14,11,15]],[[11,10,14],[14,11,15],[8,12,16]]]]

샌드 박스 게시물 (현재 삭제되었으며 평판이 2k 이상인 사용자 만 볼 수 있음) 피드백을 주신 모든 분들께 감사드립니다.
Mr. Xcoder

그래서되는 이 출력 형식은 허용?
Luis Mendo

@LuisMendo 예, 허용됩니다.
Mr. Xcoder

답변:



5

MATL , 4 바이트

thYC

입력은 n다음 M.

출력은 행렬이며 각 열에는 하위 행렬의 모든 열이 포함됩니다.

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

설명

thY    % Address the compiler with a formal, slightly old-fashioned determiner
C      % Convert input to ouput

더 심각하게, t입력 n을 암시 적으로 가져 와서 스택에 복제합니다. n의h 두 복사본을 연결 하여 배열 [n, n]을 생성합니다 . 입력 M을 내재적으로 가져 오고 모든 [n, n] 크기 블록을 추출 하여 열 주요 순서로 열로 정렬합니다. 이는 각 블록의 열이 수직으로 쌓여 단일 열을 형성 함을 의미합니다.YC


1
"공식적이고 약간 구식 인 대명사"인 LOL +1과 아주 멋진 골프.
주세페

@Giuseppe 난 그냥이 결정하지 대명사의 실현 : - /
루이스 Mendo

글쎄요, 나는 항상 소유주 대명사로서 "네 / 네"를 배웠습니다. 이것은 결정자를 처음 듣는 것입니다!
주세페

@Giuseppe "Thy / your"는 소유주 결정자입니다. 즉, "This is your car"라는 이름으로갑니다. "사물 / 귀하의 것"은 소유 대명사입니다. 즉, 이름은 생략됩니다 : "이것은 너의 것입니다". 그리고 나는 처음에 "네"와 개인 대명사를 혼동했다. 내가 만든 혼란 :-)
Luis Mendo

4

APL (Dyalog Unicode) , 26 바이트 SBCS

익명 인수 람다는 n 을 왼쪽 인수로, M 을 오른쪽 인수로 사용합니다.

{s↓(-s2⍴⌈¯1+⍺÷2)↓⊢⌺⍺ ⍺⊢⍵}

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

{} 익명 람다는 어디에 왼쪽 인자이고 올바른 인자입니다 :

⊢⍵ 오른쪽 인자를 산출 ( 분리형 ⍺ ⍺에서 )

⊢⌺⍺ ⍺ 모든 -by- 가장자리 겹치는 포함한 행렬 (그는 제로로 패딩된다)

()↓ 처음 두 차원을 따라 다음 숫자 요소를 삭제하십시오.

  ⍺÷2 반

  ¯1+ 부정적인 것 더하기

   모으다

  2⍴ 주기적 r에 두 요소의 목록을 eshape

  s← 저장 s( s hards)

  - 부정 (즉, 뒤에서 떨어짐)

s↓s첫 번째와 두 번째 치수를 따라 요소를 떨어 뜨립니다 (앞에서)


4

APL (Dyalog Unicode) , 31 바이트

{(12 1 3 4⍉⊖)⍣(4×⌊⍺÷2)⊢⌺⍺ ⍺⊢⍵}

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

Adám과는 다른 접근법.


(골프를 마친 후) 설명을 제공 하시겠습니까? 나는 그것이 어떻게 작동하는지 알고 싶다. (그리고 나는 APL을 전혀 모른다) :)
Emigna

@Emigna 그래, 그때까지 시간이 있다면.
Erik the Outgolfer

매우 영리한. 사소하지 않은 경우에 이색 을 성공적으로 사용할 수 있다면 , 실제로 어레이 프로그래밍을 마스터 한 것입니다.
Adám

아담 어 @ 내가 생각하지만,이 답변이 :-( 사실 잘못된 편집이다 : 고정,하지만 지금은 ... 31 바이트 길이의
Outgolfer 에릭

제출 한 테스트 스위트를 자유롭게 복사하십시오.
Adám

3

R , 75 바이트

function(M,N,S,W=1:N,g=N:S-N)for(i in g)for(j in g)print(M[i+W,j+W,drop=F])

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

취하고 M, NS매트릭스의 IZE.

결과 행렬을 stdout에 인쇄합니다. drop=F하여 그렇게 필요한 N=1경우 인덱싱이 떨어지지 않도록 dim속성과 산출 matrix(A)보다 오히려 vector.




2

젤리 , 5 바이트

Z⁹Ƥ⁺€

4D 출력 형식을 사용합니다. 3D의 경우 6 바이트를 추가하십시오. .

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

작동 원리

Z⁹Ƥ⁺€  Main link. Left argument: M (matrix). Right argument: n (integer)

 ⁹Ƥ    Apply the link to the left to all infixes of length n.
Z        Zip the rows of the infix, transposing rows and columns.
   ⁺€  Map Z⁹Ƥ over all results.

채팅에서 user202729와 비슷한 것을 제안했습니다. 대안적인 5 바이트는 ṡ€Zṡ€입니다.
Mr. Xcoder

2

Brachylog , 13 바이트

{tN&s₎\;Ns₎}ᶠ

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

열 목록을 반환합니다.

기술적으로, tN&s₎\;Ns₎출력을 해당 서브 매트릭스와 통합하는 생성 술어입니다. 우리는 사용{…}ᶠ 모든 가능성을 드러내 기 위해서만 합니다.

설명

 tN&              Call the second argument of the input N
{          }ᶠ     Find all:
    s₎              A substring of the matrix of size N
      \             Transpose that substring
       ;Ns₎         A substring of that transposed substring of size N

1

Stax , 10 바이트

│Æ☼♂Mqß E╖

그것을 실행

동일한 프로그램의 ASCII 표현은

YBFMyBF|PMmJ

이렇게 작동합니다.

Y               Store the number in the y register
 B              Batch the grid into y rows each
  F             Foreach batch, run the rest of the program
   M            Transpose about the diagonal
    yB          Batch the transposed slices into y rows each
      F         Foreach batch, run the rest of the progoram
       |P       Print a blank line
         M      Transpose inner slice - restoring its original orientation
          mJ    For each row in the inner grid, output joined by spaces

1

자바 스크립트 (ES6), 91 바이트

카레 구문으로 입력을 (a)(n)받습니다. 결과를 행 목록으로 반환합니다.

a=>n=>(g=x=>a[y+n-1]?[a.slice(y,y+n).map(r=>r.slice(x,x+n)),...g(a[x+n]?x+1:!++y)]:[])(y=0)

테스트 사례


1

APL (Dyalog Classic) , 24 23 바이트

t∘↑¨(¯1-t←-2⍴⎕)↓,⍀⍪\⍪¨⎕

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

결과는 행렬의 행렬이지만 Dyalog의 출력 형식은 그렇게 분명하지 않습니다.

행렬 ( )을 입력하고 각 요소를 고유 한 중첩 행렬 ( )로 바꾸고 ⍪¨행 ( ,\) 및 열 ( ⍪⍀), 접두사 n ( )으로 접두사 연결을 사용 하고 , 중첩 된 행렬의 첫 번째 n-1 행과 열을 삭제 ( (¯1-t←-2⍴⎕)↓), 각 행렬에서 오른쪽 아래 nxn 코너를 가져옵니다 ( t∘↑¨)

                                        ┌─┬──┬───┐
                                        aababc      ┼──┼───┤        ┼──┼───┤
 n=2       ┌─┬─┬─┐      ┌─┬──┬───┐      ├─┼──┼───┤      ababc        ab bc
┌───┐      abc      aabbac      aababc      dedef        de ef
abc  ⍪¨  ├─┼─┼─┤  ,\  ├─┼──┼───┤  ⍪⍀  ddedef 1 1 ┼──┼───┤¯2 ¯2∘↑¨┼──┼───┤
def ---> def ---> ddeedf ---> ├─┼──┼───┤ ---> ababc  --->       
ghi      ├─┼─┼─┤      ├─┼──┼───┤      aababc      dedef        de ef
└───┘      ghi      gghhgi      ddedef      ghghi        gh hi
           └─┴─┴─┘      └─┴──┴───┘      gghghi      ┴──┴───┘        ┴──┴───┘
                                        └─┴──┴───┘

0

루비 , 63 바이트

->c,g{n=c.size-g+1
(0...n*n).map{|i|c[i/n,g].map{|z|z[i%n,g]}}}

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

이것은 2D 배열과 int를 가져 와서 3D 배열을 반환하는 람다입니다.

언 골프 드 :

->m,n{
  a = m.size - n + 1     # The count of rows in m that can be a first row in a submatrix
  (0...a*a).map{ |b|     # There will be a*a submatrices
    m[b/a,n].map{ |r|    # Take each possible set of n rows
      r[b%a,n]           # And each possible set of n columns
    }
  }
}

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