スタガー、スタック、サム


15

このStack Overflowの質問に触発されました

チャレンジ

入力

非負の整数を含む正方行列の配列。

出力

次のように入力行列から構築された正方行列。

ましょN×N各入力行列のサイズ、であるP入力行列の数。

明確にするために、次の入力行列の例(N=2P=3)を考慮してください。

 3   5
 4  10

 6   8
12  11

 2   0
 9   1
  1. 最初の入力行列から始めます。
  2. 2番目の入力行列をN -1ステップ下にシフトし、N -1ステップ右にシフトして、左上エントリが前のエントリの右下エントリと一致するようにします。
  3. 2番目のシフトされたマトリックスが、最初のマトリックスの上に積み重ねられているように想像してください。一致するエントリで2つの値を合計します。他の値を書き込み、残りのエントリを埋めて2 N 1 × 2 N 1 行列0を取得します。入力例では、これまでの結果は2N1×2N1

     3   5   0
     4  16   8
     0  12  11
    
  4. 残りの各入力行列について、左上が累積結果行列のこれまでの右下と一致するようにずらします。例では、3番目の入力行列を含めると、

     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  5. 出力は、N1P+1×N1P+1行列で、最後の入力行列を含めた後に取得されます。

追加の規則と説明

テストケース:

いずれの場合も、最初に入力行列が表示され、次に出力が表示されます。

  1. N=2P=3

     3   5
     4  10
    
     6   8
    12  11
    
     2   0
     9   1
    
     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  2. N=2P=1

     3   5
     4  10
    
     3   5
     4  10
    
  3. N=1P=4

     4
    
     7
    
    23
    
     5
    
    39
    
  4. N=3P=2

    11  11   8
     6   8  12
    11   0   4
    
     4   1  13
     9  19  11
    13   4   2
    
    11  11   8   0   0
     6   8  12   0   0
    11   0   8   1  13
     0   0   9  19  11
     0   0  13   4   2
    
  5. N=2P=4

    14  13
    10   0
    
    13  20
    21   3
    
     9  22
     0   8
    
    17   3
    19  16
    
    14  13   0   0   0
    10  13  20   0   0
     0  21  12  22   0
     0   0   0  25   3
     0   0   0  19  16
    

これに対するMATLソリューションの期間はどのくらいですか?
ジュゼッペ

@Giuseppe MATLで試したことはありません。テストケースでは、リンクされた質問
ルイスメンドー

回答:


4

ゼリー15 12バイト

⁹ṖŻ€ƒZƲ⁺+µ@/

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

使い方

⁹ṖŻ€ƒZƲ⁺+µ@/  Main link. Argument: A (array of matrices)

         µ    Begin a monadic chain.
          @/  Reduce A by the previous chain, with swapped arguments.
                Dyadic chain. Arguments: M, N (matrices)
      Ʋ           Combine the links to the left into a monadic chain with arg. M.
⁹                 Set the return value to N.
 Ṗ                Pop; remove its last row.
     Z            Zip; yield M transposed.
    ƒ             Fold popped N, using the link to the left as folding function and
                  transposed M as initial value.
  Ż€                Prepend a zero to each row of the left argument.
                    The right argument is ignored.
       ⁺        Duplicate the chain created by Ʋ.
        +       Add M to the result.

6

R88 81バイト

function(A,N,P,o=0*diag(P*(N-1)+1)){for(i in 1:P)o[x,x]=o[x<-1:N+i-1,x]+A[[i]];o}

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

受け取りlist、行列のをANP

ゼロの必要なマトリックスを構築し、のo要素ごとAに適切なサブマトリックスにコンテンツを追加しoます。


4

JavaScript(ES6)、102バイト

入力をとして受け取ります(n,p,a)

(n,p,a)=>[...Array(--n*p+1)].map((_,y,r)=>r.map((_,x)=>a.map((a,i)=>s+=(a[y-i*n]||0)[x-i*n]|0,s=0)|s))

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

どうやって?

0w

w=n1×p+1

バツy

sバツy==0p1aバツ×n1y×n1

未定義のセルはゼロに置き換えられます。



3

ゼリー、12バイト

Z€Ż€’}¡"Jµ⁺S

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

Z€Ż€’}¡"Jµ⁺S
         µ    Everything before this as a monad.
          ⁺   Do it twice
Z€            Zip €ach of the matrices
        J     1..P
       "      Pair the matrices with their corresponding integer in [1..P] then apply the 
              following dyad:
  Ż€            Prepend 0 to each of the rows
      ¡         Repeat this:
    ’}          (right argument - 1) number of times
              Doing everything before µ twice adds the appropriate number of rows and
              columns to each matrix. Finally:
           S  Sum the matrices.

12バイト

J’0ẋ;Ɱ"Z€µ⁺S

余分なゼロが許可されてZŻ€‘ɼ¡)⁺Sいる場合は、クールな9バイトのソリューションです。TIO





1

、52バイト

≦⊖θE⊕×θηE⊕×θηΣEEη×θξ∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν§§§ζξ⁻ιν⁻λν

オンラインでお試しください!リンクは冗長バージョンのコードへのリンクであり、多少使用可能なフォーマット用に2バイトが含まれています。私はすべての配列を埋めてからそれらを合計するバージョンで始めましたが、代わりにこのバージョンを短くすることができました。説明:

≦⊖θ

入力値を減らす N

E⊕×θηE⊕×θη

結果のサイズを計算する N1P+1 暗黙の範囲を2回マッピングして、結果のマトリックスを生成し、暗黙的に印刷します。

ΣEEη×θξ

入力値の暗黙的な範囲にマップします P 各要素に掛けます N1。次に、結果の範囲にマップし、最終結果を合計します。

∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν

どちらのインデックスも範囲外ではないことを確認してください。

§§§ζξ⁻ιν⁻λν

目的の値を取得するための元の入力へのオフセット。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.