对角线求和


19

以正整数矩阵为输入,并通过矩阵输出对角线上的元素的各个和。

您只能计算对角线向下和向右的线。您必须从仅包含左下角元素的对角线开始,然后从其上方的长度为2的对角线开始(如果存在),依此类推,直到仅包含右上角元素的对角线,如下所示。

例:

Input:
 8   14    5    1
10    5    5    8
 6    6    8   10
15   15    4   11

Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})

Input:
1
Output:
1

Input: 
1 5
Output:
1, 5

Input:
4
1

Output: 
1, 4

Input:
17    4    5
24   16    5
 9   24   10
 1   14   22
 1   21   24
 4    4   17
24   25   17

Output:
24, 29, 22, 39, 47, 70, 43, 9, 5

输入和输出格式始终是可选的。

这是,因此每种语言中最短的提交内容将获胜。


Answers:


6

Haskell40 37字节

z=0:z
foldl1$(.(++z)).zipWith(+).(0:)

在线尝试!用法:(foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]]

编辑:感谢ØrjanJohansen提供-3个字节!

取消高尔夫:

z = 0:z
s#t = zipWith(+)(0:s)(t++z)
f m = foldl1 (#) m

z是无限多个零的列表。在f我们倍以上列出的名单m由两个列表与功能相结合#。在#第一个列表中s包含到目前为止的累计列总和,第二个列表t是应添加的新行。s通过在前面添加零,然后在元素上加st,将一个元素向右移动zipWith(+)。因为s可能会很大,所以我们必须t通过追加来填充足够的零z


那是短点的:foldl1$(.(++z)).zipWith(+).(0:)
与Orjan约翰森

6

Mathematica,53 54字节

l=Length@#-1&;Tr@Diagonal[#,k]~Table~{k,-l@#,l@#&@@#}&

将2D数组作为输入并返回列表的纯函数。(条目不必为整数或偶数。)Diagonal[#,k]返回主k对角线上方(或下方,如果k为负)的对角线。{k,-l@#,l@#&@@#}根据输入数组的尺寸计算所需的对角线范围。并对Tr每个对角线的项求和。


在相同的字节数下可以替代,但是也许您可以进一步打高尔夫球?那些括号看起来不好。Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
马丁·恩德

5

MATL,6个字节

T&XdXs

在线尝试!验证所有测试用例

说明

T&Xd   % All diagonals of implicit input arranged as zero-padded columns
Xs     % Sum of each column. Implicitly display

只是好奇:您认为总体上有更好的选择s==sum(x(:)),而不是像MATL那样坚持使用MATLAB约定吗?
斯蒂夫·格里芬

@StewieGriffin我有时会想到这一点。我的疑问更多在sum(x)和之间sum(x,1)。对于矩阵xsum(x)如果矩阵只有1行,其行为会有所不同,这一事实有时令人讨厌。但是最后我决定使用Matlab,因此两种语言更加接近。并fun(x,1)为最常见的情况添加一些功能
Luis Mendo,

5

果冻,5个字节

0;+µ/

在线尝试!

怎么运行的

0;+µ/  Main link. Argument: M (matrix / array of rows)

   µ   Combine all links to the left into a chain (arity unknown at parse time) and
       begin a new monadic chain.
    /  Reduce M by that chain. This makes the chain dyadic.
       Let's call the arguments of the chain L and R (both flat arrays).
0;         Prepend a 0 to L.
  +        Perform element-wise addition of the result and R.
           When the chain is called for the n-th time, R has n less elements, so
           the last n elements of L won't have matching elements in R and will be
           left unaltered.

只有要减少的第一个R少一个元素;每行增加一个元素。
与Orjan约翰森

这只是聪明...不ŒD
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer再次,其ŒD奇怪的顺序阻止了它的使用。
丹尼斯,

@Dennis那么我想我会做一些不具备如此怪异排序...哦,也许3个单子可能是进入的。
暴民埃里克(Erik the Outgolfer)'17年

5

JavaScript(ES6),65 58字节

a=>a.map(b=>b.map((c,i)=>r[i]=~~r[i]+c,r=[,...r]),r=[])&&r

63个字节的变体:a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
Arnauld

@Arnauld我同意,逆转是不好的举动。但是长度太长了!
尼尔

3

CJam22 21字节

感谢Martin Ender,节省了1个字节

{_,({0\f+}*ee::m<:.+}

匿名块在堆栈上期待参数并将结果保留在堆栈上。

在线尝试!

怎么运行的

_                   e# Duplicate the matrix
 ,(                 e# Get its length (# of rows) minus 1
   {0\f+}*          e# Prepend that many 0s to each row
          ee        e# Enumerate; map each row to [index, row]
            ::m<    e# Rotate each row left a number of spaces equal to its index
                :.+ e# Sum each column

2

05AB1E,17个字节

Rvy¹gÅ0«NFÁ}})øO¨

在线尝试!

说明

R                  # reverse input
 v                 # for each N,y (index, item)
  y¹gÅ0«           # pad y with as many zeroes as the number of rows in the input
        NFÁ}       # rotate each row N times right
            })     # wrap the result in a list
              øO   # sum the columns
                ¨  # remove the last element of the resulting list (the padded zeroes)

2

J,7个字节

+//.@|.

在线尝试!

这很简单:

+//.@|.
+/        sum
  /.      on oblique lines
    @|.   on the reversed array

斜的反向线是数组的对角线,因此这只是对角线求和。



1

果冻,8 字节

ŒDS€ṙZL$

在线尝试!

代码的一半用于将结果放入正确的顺序。

怎么样?

ŒDS€ṙZL$ - Main link: list of lists of numbers
ŒD       - diagonals (starts with the diagonal containing the top left element,
         -            then the next diagonal to the right, and so on wrapping around)
  S€     - sum €each
       $ - last two links as a monad
     Z   - transpose the matrix
      L  - length (width of the matrix)
    ṙ    - rotate the results left by that amount

1

Perl 5,47个字节

map{$j=--$.;map{@a[$j++]+=$_}split}<>
print"@a"

1

R,45个字节

将矩阵类对象作为输入的未命名函数:

function(x)sapply(split(x,col(x)-row(x)),sum)

使用答案中说明的想法 。


我相信这项挑战中的规则可以让您摆脱对的呼吁unname,但这是一个很棒的解决方案!
朱塞佩

1

八度,71字节

假设A为矩阵,例如:

A = [17 4 5;24 16 5; 9 24 10; 1 14 22; 1 21 24; 4 4 17;24 25 17];

然后我们有:

[m,n]=size(A);
a=[zeros(m,m-1),A]';
for i=1:m+n-1
trace(a(i:end,:))
end

请注意,转置矩阵会反转对角线总和的顺序,从而在for循环中总共节省了两个字节。

输出:

ans =  24
ans =  29
ans =  22
ans =  39
ans =  47
ans =  70
ans =  43
ans =  9
ans =  5

1
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),end节省6个字节。八度可以执行直接索引和内联分配。不幸的是,假设在之前运行代码的工作空间中的变量存在是不允许的,所以我觉得你必须使用input,像这样把它备份到75个字节。不错的方法,所以让我+1 :)欢迎来到PPCG!=)
Stewie Griffin's

另外,zeros(m-1,m)可以写~e(m-1,m),节省4个字节:)整洁吧?
斯蒂夫·格里芬

0

Python,126个字节

x=input()
f=lambda k:[x[i+k][i]for i in range(len(x)-k)]
a=map(f,range(4)[::-1])
x=zip(*x)
print(map(sum,a+map(f,range(1,4))))

f仅适用于下部三角形部分,因此我将其转置并以这种方式获得上部三角形部分。不知道为什么该f函数对负值不起作用(我改成f了较短的词,因为获取负数的部分不起作用)。


我收到最后一个测试用例的错误。tio.run/nexus/…–
丹尼斯

0

C,148字节

在线尝试

s;g(int i,int j,int**m,int x){for(s=0;x;x--)s+=m[i++][j++];printf(" %d",s);}
k;f(int n,int**m){for(k=n;--k;)g(k,0,m,n-k);for(;k<n;k++)g(0,k,m,n-k);}


0

Awk,67字节

{for(f=0;f++<NF;)s[NF-NR+f]+=$f}END{i=0;while(i++<NR*2)print s[i]}

取消高尔夫:

{
    for (f = 0; f++ < NF;)
        s[NF-NR+f] += $f
}
END {
    i = 0
    while (i++ < NR*2)
        print s[i]
}

Awk在空白处分割$nnth字段(1索引);NF是该行上的字段NR数,是当前行的数目。未定义的变量为0,并在首次使用时创建。


0

PHP,86字节

有两种变体的内存友好型解决方案:

<?for($i=$c=count($a=$_GET);--$i>-$c;print$s._)for($s=0,$d=$c;$d--;)$s+=$a[$i+$d][$d];
<?for($i=$c=count($a=$_GET);--$i>-$c;print$s._)for($s=$d=0;$d<$c;)$s+=$a[$i+$d][$d++];

从脚本参数获取输入,使用下划线作为分隔符;
使用默认设置(不是默认的php.ini)或在线尝试


0

Clojure,81个字节

#(apply map +(map(fn[i c](concat(repeat(-(count %)i 1)0)c(repeat i 0)))(range)%))

非常详细,因为它用零填充列表,所以我们可以只计算列式总和。


0

mathematica 73字节

Plus@@@Table[Diagonal[Partition[#1,#2[[1]]],k],{k,-#2[[2]]+1,#2[[1]]-1}]&

这适用于任何2D数组mxn(不仅是nxn)
,还可以在代码末尾输入数组,如下所示(最后一个测试用例)

[{17,4,5,24,16,5,9,24,10,1,14,22,1,21,24,4,4,17,24,25,17},{3,7}]

{24、29、22、39、47、70、43、9、5}

输入格式为[{a,b,c,d ...},{m,n}]

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.