複製された行列の合計


11

数のリスト[ a 1 a 2 ... a n ]が与えられ、すべての行列Aᵢの合計を計算します。ここで、Aᵢは次のように定義されます(mはすべてのaᵢの最大値です)。

       1  2  ⋯ (i-1) i (i+1) ⋯  n
     +----------------------------
 1   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
 2   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
 .   . .  .      .   .   .      .
 .   . .  .      .   .   .      .
aᵢ   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
aᵢ₊₁ | 0  0  ⋯   0   0   0   ⋯  0
 .   . .  .      .   .   .      .
 .   . .  .      .   .   .      .
 m   | 0  0  ⋯   0   0   0   ⋯  0

入力が与えられると、[2,1,3,1]次のマトリックスを作成します。

[2 2 2 2]   [0 1 1 1]   [0 0 3 3]   [0 0 0 1]   [2 3 6 7]
[2 2 2 2] + [0 0 0 0] + [0 0 3 3] + [0 0 0 0] = [2 2 5 5]
[0 0 0 0]   [0 0 0 0]   [0 0 3 3]   [0 0 0 0]   [0 0 3 3]

ルールとI / O

  • 入力が空でないと仮定することができます
  • すべての入力が非負(0≤)であると仮定できます
  • 入力は1×n(またはn×1)行列、リスト、配列などです。
  • 同様に、出力は行列、リストのリスト、配列などです。
  • デフォルトのI / O形式を介して入力を取得および返すことができます
  • あなたの提出物は完全なプログラムまたは機能である可能性があります

テストケース

[0] -> [] or [[]]
[1] -> [[1]]
[3] -> [[3],[3],[3]]
[2,2] -> [[2,4],[2,4]]
[3,0,0] -> [[3,3,3],[3,3,3],[3,3,3]]
[1,2,3,4,5] -> [[1,3,6,10,15],[0,2,5,9,14],[0,0,3,7,12],[0,0,0,4,9],[0,0,0,0,5]]
[10,1,0,3,7,8] -> [[10,11,11,14,21,29],[10,10,10,13,20,28],[10,10,10,13,20,28],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,10,18],[10,10,10,10,10,10],[10,10,10,10,10,10]]

フォントの違いなどがあると思います。編集内容がロールバックされました。これは、現在、私にどのように見えるかですimgur.com/a06RH9r これは縦の楕円が何らかの理由で固定幅フォントでレンダリングされていない、と列に整列していないWindows 10上にクロムです。それが私がそれを変えた理由です。しかし、環境によって異なるように見えるに違いないと思います。
再帰的

1
間違いなくフォントの問題。両方のリビジョンが画面上でずれています。
デニス

転置した結果を返すことができますか?
アダム


1
@Adám:ノーと言うつもりです、しかし、そうするあなたの投稿に解決策を自由に含めてください。
ბიმო

回答:


9

ゼリー10 5バイト

ẋ"z0Ä

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

使い方

ẋ"z0Ä  Main link. Argument: A (array)


       e.g. [2, 1, 3, 1]

ẋ"     Repeat each n in A n times.

       e.g. [[2, 2   ]
             [1      ]
             [3, 3, 3]
             [1      ]]

  z0   Zipfill 0; read the result by columns, filling missing elements with 0's.

        e.g. [[2, 1, 3, 1]
              [2, 0, 3, 0]
              [0, 0, 3, 0]]

    Ä  Take the cumulative sum of each row vector.

       e.g. [[2, 3, 6, 7]
             [2, 2, 5, 5]
             [0, 0, 3, 3]]

4

R、80バイト

n=sum((a=scan())|1);for(i in 1:n)F=F+`[<-`(matrix(0,max(a),n),0:a[i],i:n,a[i]);F

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

stdinから入力を受け取ります。印刷0x1入力のためのマトリックス0のように出力し、

	[,1]


3
不思議な人のために、Fは、初期値がである組み込みグローバル変数ですFALSE。ここでは0に強制され、累積合計の初期値として使用されます。この回答は、実際に使用しないように特別に設計されたコードFT除き、使用しない理由を示しています!
-ngm



3

APL(Dyalog Unicode)、8 バイトSBCS

完全なプログラム。リストに標準入力を要求し、行列を標準出力に出力します。

デニスの方法を使用します。

+\⍉↑⍴⍨¨⎕

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

 標準

⍴⍨¨Rの各々のeshape、自分撮り

 リストのリストを行列にミックスし、0で埋めます

 転置

+\ 行ごとの累積合計

それは潜在的に除外とすることができるよう、すべての計算違いを確認しない\ように変更列方向の代わりに、行方向の合計します。



2

オクターブ、64バイト

@(x,k=a=0*(x+(1:max(x))'))eval"for i=x;a(1:i,++k:end)+=i;end,a";

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

説明:

繰り返しますが、引数リストとevalの式は1つの関数で使用されます:)

これはx入力として受け取り、ゼロで満たされた2つの同一の行列を次元で作成しk=a=zeros(length(x),max(x))ます。これは、で水平ベクトルxと垂直ベクトルを追加し1:max(x)、暗黙的に次元を2D配列に拡張し、これにゼロを掛けることで達成されます。~(x+...)残念ながら機能しませんa。これは、関数の残りの部分で論理配列になることを強制するためです。

for i=xループが反復ごとになることですi=x(1)、その後、i=x(2)というように。a(1:i,k++:end)反復ごとに更新する必要があるマトリックスの一部です。1:i更新する行を示すベクトルです。の場合i=0、これは空のベクトルになり、更新されません1, 2 ...。それ以外の場合はになります。マトリックスを1 ++k:end増分し、kこのマトリックスの最初の値(1,2,3...)からマトリックスの最後の列までの範囲を作成しますa+=iに現在の値を追加しますaend,aループを終了して出力しますa




1

Java 10、142バイト

a->{int l=a.length,i=0,j,s,m=0;for(int q:a)m=q>m?q:m;int[][]r=new int[m][l];for(;i<m;i++)for(j=s=0;j<l;j++)r[i][j]=s+=i<a[j]?a[j]:0;return r;}

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

a->{               // Method with integer-array parameter and integer-matrix return-type
  int l=a.length,  //  Length of the input-array
      i,j,         //  Index integers
      s,           //  Sum integer
  m=0;for(int q:a)m=q>m?q:m;
                   //  Determine the maximum of the input-array
  int[][]r=new int[m][l];
                   //  Result-matrix of size `m` by `l`
  for(;i<m;i++)    //  Loop `i` over the rows
    for(j=s=0;     //   Reset the sum to 0
        j<l;j++)   //   Inner loop `j` over the columns
      r[i][j]=s+=  //    Add the following to the sum `s`, add set it as current cell:
        i<a[j]?    //     If the row-index is smaller than the `j`'th value in the input:
         a[j]      //      Add the current item to the sum
        :          //     Else:
         0;        //      Leave the sum the same by adding 0
  return r;}       //  Return the result-matrix


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