对我矩阵的增量求和


17

背景

整数数组的增量是通过获取连续元素的差形成的数组。例如,[1, 2, 4, 7, 3, 9, 6]具有以下增量:[1, 2, 3, -4, 6, -3]

现在,我们将整数矩阵的增量定义为每一行及其包含的每一列的增量。

举个例子:

Row deltas:

1 2 3 4 │ => [1, 1, 1]
4 5 6 7 │ => [1, 1, 1]
7 1 8 2 │ => [-6, 7, -6]

Column deltas (the matrix' columns have been rotated into rows for simplicity):

1 4 7 │ => [3, 3] 
2 5 1 │ => [3, -4]
3 6 8 │ => [3, 2]
4 7 2 │ => [3, -5]

这为我们提供了矩阵增量的以下列表:

[[1, 1, 1], [1, 1, 1], [-6, 7, -6], [3, 3], [3, -4], [3, 2], [3, -5]]

而且由于我们不希望它们嵌套,我们将列表扁平化:

[1, 1, 1, 1, 1, 1, -6, 7, -6, 3, 3, 3, -4, 3, 2, 3, -5]

任务

您的任务是求和作为输入给出的矩阵的所有增量。请注意,矩阵将仅由非负整数组成。

规则

  • 所有标准规则均适用。

  • 您可以假设矩阵的每一行和每一列至少包含两个值,因此最小大小为2x2

  • 只要指定矩阵,就可以采用任何合理的格式。

  • 可能不认为矩阵是正方形。

  • 如果它可以帮助您减少字节数,则可以选择将行数和列数也用作输入(看您的C!)。

  • 这是代码高尔夫球,因此每种语言中最短的代码(以字节为单位)将获胜!

测试用例

输入=>输出

[[1,2],[1,2]] => 2
[[8,7,1],[4,1,3],[5,5,5]] => -9
[[1、2、3],[4、5、6],[7、8、9]] => 24
[[9,9,9,9,9,9],[9,9,9,9,9]] => 0
[[1、3、14],[56、89、20],[99、99、99]] => 256
[[1、2、3、4],[4、5、6、7],[7、1、8、2]] => 9
[[13、19、478],[0、12、4],[45、3、6],[1、2、3]] => -72

Answers:


12

Python 2,42个字节

lambda m:sum(r[-1]-r[0]for r in m+zip(*m))

一个未命名的函数,使用列表清单m,并返回结果编号。

在线尝试!

怎么样?

列表增量的总和是最后一个元素减去第一个元素,其他所有元素都被取消:
(r [n] -r [n-1])+(r [n-1] -r [n-2]) + ... +(r [2] -r [1])= r [n] -r [1]

zip(*m)用途拆包(*的)m来的行通过m作为单独的参数zip(交错),并且因此转置矩阵。在python 2中,这会产生一个(元组的列表,但这很好),因此我们可以将其添加(连接)到(with)m,逐步遍历所有行和列,r对每个行和列执行上述操作,然后将结果相加(sum(...))。



8

八度,33字节

@(x)sum([diff(x)(:);diff(x')(:)])

在线尝试!

说明:

这是一个匿名函数,x用作输入。它采用所有列之间的差异,并将其与转置的列之间的差异串联起来x。然后沿第二维求和该向量。



5

JavaScript(ES6),68 67字节

m=>m.map(r=>s+=[...l=r].pop()-r[0],s=0)|m[0].map(v=>s+=l.pop()-v)|s

格式化和评论

m =>                              // given a matrix m
  m.map(r =>                      // for each row r of m
    s += [...l = r].pop() - r[0], //   add to s: last value of r - first value of r
    s = 0                         //   starting with s = 0
  ) |                             //
  m[0].map(v =>                   // for each value v in the first row of m:
    s += l.pop() - v              //   add to s: last value of last row of m - v
  ) |                             //
  s                               // return s

由于输入矩阵的最小大小为2x2,因此m.map(...)|m[0].map(...)可以保证将其强制为0。因此,使用返回安全的结果是安全的|s

测试用例


5

MATL,7个字节

dG!dhss

在线尝试!

说明:

假设输入为

[8 7 1; 4 1 3; 5 5 5]

d        % Difference between rows of input
         % Stack:
         % [-4 -6  2; 1  4  2]
 G       % Grab the input again. Stack:
         % [-4 -6  2; 1  4  2]
         % [8 7 1; 4 1 3; 5 5 5]]
  !      % Transpose the bottom element. Stack:
         % [-4 -6  2; 1  4  2]
         % [8 4 5; 7 1 5; 1 3 5]
   d     % Difference between rows. Stack:
         % [-4 -6  2; 1  4  2]
         % [-1 -3  0; -6  2  0]
    h    % Concatenate horizontally. Stack:
         % [-4 -6  2 -1 -3  0; 1  4  2 -6  2  0]
     ss  % Sum each column, then sum all column sums. Stack:
         % -9


4

J,14个字节

+/@,&({:-{.)|:

在线尝试!

说明

+/@,&({:-{.)|:  Input: matrix M
            |:  Transpose
     (     )    Operate on M and M'
      {:          Tail
        -         Minus
         {.       Head
   ,&           Join
+/@             Reduce by addition

3

外壳,7个字节

ΣṁẊ-S+T

在线尝试!

-1感谢Xcoder先生把我的注意力从对S¤与朝m(应该一直)。
-1感谢Zgarb的虐待S

说明:

ΣṁẊ-S+T 3-function composition
    S   (x -> y -> z) (f) -> (x -> y) (g) -> x (x) (implicit): f x g x
     +    f: [x] (x) -> [x] (y) -> [x]: concatenate two lists
      T   g: [[x]] (x) -> [[x]]: transpose x
 ṁ      (x -> [y]) (f) -> [x] (x) -> [y]: map f on x and concatenate
  Ẋ       f: (x -> y -> z) (f) -> [x] (x) -> [z]: map f on splat overlapping pairs of x
   -        f: TNum (x) -> TNum (y) -> TNum: y - x
Σ       [TNum] (x) -> TNum: sum x


也是8个字节,而是使用您的方法。
Xcoder先生17年

@ Mr.Xcoder忘记了这一点
Outgolfer选手Erik


3

Haskell,60个字节

e=[]:e
z=zipWith
f s=sum$(z(-)=<<tail)=<<(s++foldr(z(:))e s)

在线尝试!使用我之前发现较短的转置

说明

e是一个空列表的无限列表,用于转置。 z是该zipWith函数的简写,因为它被使用了两次。

f s=                                        -- input s is a list of lists
                            foldr(z(:))e s  -- transpose s
                         s++                -- append the result to the original list s
                     =<<(                 ) -- map the following function over the list and concatenate the results
        (z(-)=<<tail)                       -- compute the delta of each list by element-wise subtracting its tail
    sum$                                    -- compute the sum of the resulting list

3

Brachylog,13个字节

源自@sundar的设计

⟨≡⟨t-h⟩ᵐ²\⟩c+ 

说明

⟨≡      \⟩          #   Take the original matrix and it's transpose 
      ᵐ             #       and execute the following on both
       ²            #           map for each row (this is now a double map "ᵐ²")
  ⟨t h⟩             #               take head and tail
   -                #               and subtract them from each other (sum of deltas in a row)
         c+         #       and add all the values 
                    #           (we have two arrays of arrays so we concat them and sum them)

⟨⟩被搞乱了格式化,对不起

在线尝试!


2

Pyth,7个字节

ss.+M+C

在这里尝试。

我第一次用高尔夫球语言回答!感谢@EriktheOutgolfer -1个字节!

说明

ss.+M+C    ~ This is a full program with implicit input (used twice, in fact)

      C    ~ Matrix transpose. Push all the columns;
     +     ~ Concatenate with the rows;
  .+M      ~ For each list;
  .+       ~ Get the deltas;
 s         ~ Flatten the list of deltas;
s          ~ Get the sum;
           ~ Print Implicitly;


@EriktheOutgolfer哇,谢谢!

2

Brachylog22 16字节

⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ

在线尝试!

(-6个字节受@Kroppeb的建议启发。)

?⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ.       Full code (? and . are implicit input and output)
?⟨≡{       }ᵐ\⟩          Apply this on both the input and its transpose:
    s₂ᶠ                  Get pairs of successive rows, [[row1, row2], [row2, row3], ...]
       c                 Flatten that: [row1, row2, row2, row3, row3, row4, ...]
        +ᵐ               Sum the elements within each row [sum1, sum2, sum2, sum3, ...]
          -              Get the difference between even-indexed elements (starting index 0)
                         and odd-indexed elements, i.e. sum1+sum2+sum3+... - (sum2+sum3+sum4+...)
                         This gets the negative of the usual difference i.e. a-b instead of b-a
                         for each pair of rows
               +         Add the results for the input and its transpose
                ṅ        Negate that to get the sign correct
                 .       That is the output

增量的总和等于最后一个元素-第一个⟨t-h⟩完成技巧。结果{⟨t-h⟩ᵐ+}R&\↰₁;R+缩短了5个字节。在线尝试!
Kroppeb

使用⟨≡{...}ᵐ\⟩+而不是{...}R&\↰₁;R+节省2个字节。结果导致⟨≡{⟨t-h⟩ᵐ+}ᵐ\⟩+ 在线尝试!
Kroppeb

在双重地图中更改地图的映射,并在处进行串联和求和,并删除另外2个字节⟨≡⟨t-h⟩ᵐ²\⟩c+在线尝试!
Kroppeb

@Kroppeb这是一个足够不同且足够大的改进,您应该自己将其发布为新答案。看到您的建议后,我想到了使用其他方法的16字节解决方案的想法。⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ 在线尝试!,因此我将以该版本更新此答案。
sundar-恢复莫妮卡

2

Japt -x11 10 9字节

cUy)®än x

尝试一下


说明

c             :Concatenate
 U            :  Input array
  y           :  Transpose
   )          :End concatenation
    ®         :Map
     än       :  Deltas
        x     :  Reduce by addition
              :Implicitly reduce by addition and output

1

SOGL V0.12,9个字节

:⌡-≤H⌡-¹∑

在这里尝试!添加,因为这需要在堆栈上输入)

说明:

:          duplicate ToS
 ⌡         for each do
  -          get deltas
   ≤       get the duplicate ontop
    H      rotate it anti-clockwise
     ⌡     for each do
      -      get deltas
       ¹   wrap all of that in an array
        ∑  sum

1
添加是因为这需要在堆栈上输入 -我一直想问这个问题很长时间了:输入是否自动推送到堆栈?如果不是,并且期望输入已经存在于堆栈中,您是否也不应添加字节数?不知道如何处理这些情况。还是像一个函数?
Xcoder先生17年

@ Mr.Xcoder嗯..我认为这是由默认输入允许的,但我想有只为功能..再说,我可以叫作为这样的一个匿名函数(在SOGL“功能”的定义是functionNameSingleChar\n
dzaima

哦,好吧。那是完全有效的。
Xcoder先生17年

1

Mathematica,45个字节

Tr@Flatten[Differences/@#&/@{#,Transpose@#}]&

输入项

[{{13,19,478},{0,12,4},{45,3,6},{1,2,3}}


为每个数组中的最后一个减去最后一个会更短{#,Transpose@#}吗(就像我的Python回答)?
乔纳森·艾伦,

Total[Differences/@{#,Thread@#},3]&
alephalpha

1

CJam,19个字节

0q~_z+2few:::-:+:+-

输入是数字列表。在线尝试!

说明

0       e# Push 0
q~      e# Evaluated input. 
_       e# Duplicate
z       e# Zip (transpose)
+       e# Concatenate. This gives a lists of lists of numbers, where the
        e# inner lists are the original rows and the columns
2few    e# Replace each inner list of numbers by a list of overlapping
        e# slices of size 2. We not have three-level list nesting
:::-    e# Compute difference for each of those size-two slices. We now
        e# have the deltas for each row and column
:+      e# Concatenate all second-level lists (de-nest one level)
:+      e# Sum all values
-       e# Subtract from 0, to change sign. Implicitly display

4
这个答案需要更多的冒号。有2few冒号。
Esolanging Fruit

0

MY,9个字节

ωΔω⍉Δ ḟΣ↵

在线尝试!

由于我无法在聊天中对丹尼斯进行ping操作以拉出我的密码(由于暂停),因此当前无法使用。(Δ以前在减法时没有证明) 感谢丹尼斯拉我的人!

怎么样?

  • ωΔ,第一个命令行参数的增量
  • ω⍉Δ,第一个命令行参数的转置的增量
  • ,在一个列表中
  • ,展平
  • Σ,总和
  • ,输出


0

Pyt,11个字节

Đ⊤ʁ-⇹ʁ-áƑƩ~

说明:

          Implicit input (as a matrix)
Đ         Duplicate the matrix
⊤         Transpose the matrix
ʁ-        Get row deltas of transposed matrix
⇹         Swap top two elements on the stack
ʁ-        Get row deltas of original matrix
á         Push the stack into an array
Ƒ         Flatten the array
Ʃ         Sum the array
~         Flip the sign (because the deltas are negative, as subtraction was performed to obtain them)
          Implicit output
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.