交错,堆积,求和


15

受此堆栈溢出问题启发

挑战

输入值

包含非负整数的正方形矩阵的数组。

输出量

根据输入矩阵构建的方阵如下。

ñ×ñ为每个输入矩阵的大小,P为输入矩阵的数目。

为了清楚起见,请考虑以下示例输入矩阵(ñ=2P=3):

 3   5
 4  10

 6   8
12  11

 2   0
 9   1
  1. 从第一个输入矩阵开始。
  2. 将第二个输入矩阵N -1下移,N -1右移,以使其第二个输入矩阵的左上条目与前一个的右下条目重合。
  3. 想象一下第二个移位矩阵,就像它堆叠在第一个顶部一样。在重合条目中将两个值求和。写下其他值,并用填充其余条目,0以获得2ñ-1个×2ñ-1个矩阵。使用示例输入,到目前为止的结果是

     3   5   0
     4  16   8
     0  12  11
    
  4. 对于每个剩余的输入矩阵,请对其进行交错处理,以使其到目前为止的累计结果矩阵的左上角与右下角重合。在示例中,包括第三输入矩阵

     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  5. 输出是在包含最后一个输入矩阵之后获得的ñ-1个P+1个×ñ-1个P+1个矩阵。

附加规则和说明

测试用例:

在每种情况下,首先显示输入矩阵,然后显示输出。

  1. ñ=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. ñ=2P=1个

     3   5
     4  10
    
     3   5
     4  10
    
  3. ñ=1个P=4

     4
    
     7
    
    23
    
     5
    
    39
    
  4. ñ=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. ñ=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中尝试过。对于测试用例,我使用链接问题中答案中的MATLAB代码
Luis Mendo,

Answers:


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矩阵,AN,和P

建立必要的零矩阵,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=ñ-1个×p+1个

Xÿ

sXÿ=一世=0p-1个一种一世X-一世×ñ-1个ÿ-一世×ñ-1个

未定义的单元格将被替换为零。


3

Python 2,124字节

def f(m,N,P):w=~-N*P+1;a=[w*[0]for _ in' '*w];g=0;exec"x=g/N/N*~-N;a[x+g/N%N][x+g%N]+=m[x][g/N%N][g%N];g+=1;"*P*N*N;return a

在线尝试!


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η×θξ∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν§§§ζξ⁻ιν⁻λν

在线尝试!链接是冗长的代码版本,包括两个字节,用于某些有用的格式设置。我从一个版本开始,该版本填充了所有数组,然后将它们求和,但是我能够打高尔夫球的版本变短了。说明:

≦⊖θ

减少输入值 ñ

E⊕×θηE⊕×θη

计算结果的大小 ñ-1个P+1个 并在隐式范围上映射两次,从而生成隐式打印的结果矩阵。

ΣEEη×θξ

映射输入值的隐式范围 P 并将每个元素乘以 ñ-1个。然后,在结果范围内映射并求和最终结果。

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

检查两个索引均未超出范围。

§§§ζξ⁻ιν⁻λν

偏移到原始输入以获取所需的值。

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.