与えられたサイズのすべての正方形部分行列を生成します


14

整数Mの正方行列と、Mのサイズより厳密に小さい別の正の整数nが与えられます。あなたの仕事は、サイズnMのすべての正方形部分行列を生成することです。

この課題のために、正方形のサブマトリックスMに含まれる隣接する行と列のグループです。

入力/出力フォーマット

他の合理的な形式を自由に選択できます。これらはほんの一例です。

入力

  • ネイティブマトリックスタイプのマトリックス(言語にマトリックスがある場合)
  • 2D配列(それぞれが1行/ 1列に対応する1D配列の配列)
  • 1D配列(行列は常に正方形であるため)
  • 文字列(スペースを選択しましたが、これを悪用しないでください)など

出力

  • マトリックスのマトリックス。
  • 各要素(3Dリスト)が行/列の部分行列を表す4D配列。
  • 3D配列。各要素(2Dリスト)はサブマトリックスを表します。
  • 結果の部分行列などの文字列表現。

スペック

  • 入力としてMサイズを選択することもできます。少なくとも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以上の評判を持つユーザーのみが表示できます)。フィードバックをくださった皆さんに感謝します。
Mr Xcoder

そうです、この出力フォーマットは許可されていますか?
ルイスメンドー

@LuisMendoはい、許可されています。
ミスター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 "Thy / your"は所有格の決定者です。つまり、「This is your car」という名前で行きます。「Thine / yours」は所有代名詞です。つまり、「This is yours」という名前は省略されます。そして、最初は「thy」を個人の代名詞と混同しました。これは実際には「thou」です。なんて面倒なことだったんだろう:-)
ルイスメンドー

4

APL(Dyalog Unicode)、26 バイトSBCS

nを左引数として、Mを右引数としてとる匿名中置ラムダ。

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

オンラインでお試しください!

{} 匿名ラムダは、左引数で右引数です:

⊢⍵ 正しい引数を生成します(から分離⍺ ⍺します

⊢⌺⍺ ⍺エッジとオーバーラップするものを含む すべてのサブマトリックス(ゼロが埋め込まれます)

()↓ 最初の2つの次元に沿って次の要素をドロップします。

  ⍺÷2 半分の

  ¯1+ ネガティブプラス

   切り上げする

  2⍴ 周期的にrの二つの要素のリストにeshapeを

  s← 店舗s(のためのS hards)

  - 否定する(すなわち、後ろから落ちる)

s↓s(正面から)1番目と2番目の次元に沿って要素をドロップします


4

APL(Dyalog Unicode)、31 バイト

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

オンラインでお試しください!

アダムとは異なるアプローチ。


(もちろんゴルフを終えた後に)説明をするつもりですか?私はそれがどのように機能するのか興味があります(そして私はAPLをまったく知りません):)
エミグナ

@Emignaうん、それまでに時間があれば。
エリックアウトゴルファー

非常に賢い。自明でない場合にダイアディックを正常に使用できれば、配列プログラミングを真にマスターしたことになります。
アダム

@Adámええと、この答えは実際には無効だと思いますが:-(編集:修正されましたが、現在は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])

オンラインでお試しください!

受け取りMNおよびSマトリックスのIZE。

結果の行列を標準出力に出力します。drop=Fが必要なので、N=1インデックス付けがdim属性を削除せず、a matrixではなくaを生成する場合にvector


3

J11 8バイト

マイルのおかげで-3バイト

<;._3~,~

オンラインでお試しください!


1
これは、8バイト<;._3~,~を使用し、代わりにフックを使用してサイズをそれ自体とペアにし、マトリックスのマトリックスが出力として許可されるため、それぞれをカットおよびボックス化します。
マイル

@milesありがとう、今はエレガントです!
ガレンイワノフ


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

2

ブラキログ、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

スタックス、10 バイト

│Æ☼♂Mqß E╖

それを実行します

同じプログラムのアスキー表現は

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バイト

カリー化構文の入力を受け取ります(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⍴⎕)↓)、各行列から右下のn行n列の角を取ります(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.