生成给定大小的所有平方子矩阵


14

您将得到一个整数M和另一个正整数n的方阵,严格小于M的大小。您的任务是生成大小为M的所有平方子矩阵 n

出于此挑战的目的,正方形子矩阵M中包含的一组相邻行和列。

输入/输出格式

您可以自由选择任何其他合理的格式,这些只是一些示例。

输入值

  • 本机矩阵类型的矩阵(如果您的语言有一种)
  • 2D数组(1D数组的数组,每个数组对应于一行/一列)
  • 一维数组(因为矩阵始终为正方形)
  • 字符串(您选择了空格,但请勿以任何方式滥用此字符串),等等。

输出量

  • 矩阵矩阵。
  • 4D数组,其中每个元素(3D列表)代表行/列上的子矩阵。
  • 3D数组,其中每个元素(2D列表)代表一个子矩阵。
  • 所得子矩阵的字符串表示形式,等等。

眼镜

  • 您可以选择采取大小中号输入了。保证至少为2
  • 输出的方向是任意的:您可以选择将子矩阵输出为列列表或行列表,但是选择必须一致。
  • 您可以使用任何编程语言进行竞争,并且可以通过任何标准方法接受输入并提供输出,同时请注意,默认情况下,这些漏洞是禁止的。
  • 这是,因此每种语言的最短提交(以字节为单位)将获胜。

给定n = 3M

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

可能的3x3子矩阵为:

+ ------- + + -------- + 1 2 3 4 1 2 3 4
| 1 2 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的用户才能查看)。感谢所有提供反馈的人。
Xcoder先生,18年

那么允许这种输出格式吗?
路易斯·门多

@LuisMendo是的,允许。
Xcoder先生18年

Answers:


6

05AB1E,8个字节

2FεŒsù}ø

在线尝试!

说明

2F            # 2 times do:
  ε    }      # apply to each element in the input matrix (initially rows)
   Œsù        # get a list of sublists of size input_2
        ø     # transpose (handling columns on the second pass of the loop)

5

MATL,4个字节

thYC

输入为n,则M

输出是一个矩阵,其中每一列都包含一个子矩阵的所有列。

在线尝试!

说明

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

更严重的是,隐式t接受输入n并将其复制到堆栈上。h连接n的两个副本,产生数组[n,n]。隐式YC获取输入M,提取其所有[n,n]个大小的块,并将它们按列大顺序排列为列。这意味着每个块的列垂直堆叠以形成单个列。


1
大声笑+1代表“正式的,稍稍过时的代词”,也是非常不错的高尔夫。
朱塞佩

@Giuseppe我刚刚意识到这是一个决定因素,而不是代词:-/
Luis Mendo

好吧,我总是把“你/你的”学习为所有格代名词。这是我第一次听到确定者!
朱塞佩

@Giuseppe“您/您的”是所有格确定符,也就是说,它们带有一个名称:“这是您的车”。“您的/您的”是所有格代词,即名称被省略:“这是您的”。我最初将“您的”与人称代词混淆,实际上是“您”。我真是一团糟:-)
路易斯·门多

4

APL(Dyalog Unicode),26 字节SBCS

n为左参数,以M为右参数的匿名中缀lambda 。

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

在线尝试!

{} 匿名lambda其中,左边的参数是右边的参数:

⊢⍵ 得到正确的参数(中隔离⍺ ⍺

⊢⌺⍺ ⍺ 所有子矩阵,包括那些与边缘重叠的子矩阵(那些用零填充)

()↓ 在前两个维度上放置以下数字元素:

  ⍺÷2 一半

  ¯1+ 负一加

   围捕

  2⍴ 周期性[R ESHAPE两个元素的列表

  s← 存储在s(for s顽固派)

  - 取反(即从后面掉落)

s↓s沿第一和第二维度放置元素(从前面开始)


4

APL(Dyalog Unicode),31 个字节

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

在线尝试!

与Adám的方法不同。


您是否打算提供解释(当然,在完成高尔夫球之后)?我很想知道它是如何工作的(而且我一点也不了解APL):)
Emigna

@Emigna是的,如果我有时间的话。
暴民埃里克(Erik the Outgolfer)'18年

非常聪明。如果您可以在非平凡的情况下成功使用dyadic ,那么您已经真正掌握了数组编程。
亚当

@AdámUh,尽管我认为这个答案实际上是无效的:-(编辑:已修复,但是现在它的长度为31个字节...
Erik the Outgolfer

请随意从我提交的内容中复制测试套件。
亚当

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])

在线尝试!

注意到MNS矩阵的大小。

将结果矩阵打印到标准输出;drop=F是必需的,因此在N=1建立索引时不会删除dim属性并产生a 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ṡ€
Xcoder先生18年

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

JavaScript(ES6),91字节

以currying语法接受输入(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⍴⎕)↓),从每个矩阵(t∘↑¨)的右下角乘n

                                        ┌─┬──┬───┐
                                        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数组的lambda。

取消高尔夫:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.