复制矩阵的总和


11

给定数字列表[ a 1 a 2 ... a n ],计算所有矩阵A the的总和,其中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上的Chrome。出于某些原因,垂直椭圆不以等宽线呈现,并且不与列对齐。这就是为什么我更改了它。但是我猜它在不同的环境中看起来必须不同。
递归

1
绝对是字体问题。这两个修订版在我的屏幕上均未对齐。
丹尼斯

我们可以返回转置后的结果吗?
亚当


1
@Adám:我会拒绝,但是请在您的帖子中随意添加一个解决方案。
ბიმო

Answers:


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

JavaScript(ES6),88 79字节

返回[][0]

f=(a,y,b=a.map((_,x)=>a.map(c=>y>=c|x--<0?0:s+=c,s=0)|s))=>s?[b,...f(a,-~y)]:[]

在线尝试!


3

APL(Dyalog Unicode),8 字节SBCS

完整程序。提示标准输入以获得列表,将矩阵输出到标准输出。

使用Dennis的方法

+\⍉↑⍴⍨¨⎕

在线尝试!

 标准输入

⍴⍨¨ř每个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中的表达式:)

x作为输入,并创建两个相同的矩阵,这些矩阵的大小为,填充有零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 ...++k:endk矩阵加1,并创建一个从该矩阵的第一个值(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


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.