マトリックスのデルタを合計する


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]

仕事

あなたの仕事は、入力として与えられた行列のすべてのデルタ合計することです。行列は負でない整数のみで構成されることに注意してください。

ルール

  • すべての標準ルールが適用されます。

  • 行列の各行と列に少なくとも2つの値が含まれていると想定できるため、最小サイズは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、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

回答:


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(...))。





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



3

、7バイト

ΣṁẊ-S+T

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

-1 Xcoder氏が私の焦点を(から)に、Sそして(に¤向かってm)に向けてくれたことに感謝します。
-1 ズガルブ虐待のおかげ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

代わりにあなたのアプローチを使用して、8バイトも。
ミスターXcoder

@ Mr.Xcoderはそれを忘れてしまった
エリック・ザ・アウトゴルファー


3

Haskell、60バイト

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

オンラインでお試しください!少し前に見つけた短いトランスポーズを使用します。

説明

e空リストの無限リストで、転置に使用されます。 2回使用されるためzzipWith関数の省略形です。

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+ᵐ-}ᵐ\⟩+ṅ

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

(@Kroppebの提案に触発された-6バイト。)

?⟨≡{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バイト短くなります。オンラインでお試しください!
クロッペブ

⟨≡{...}ᵐ\⟩+代わりに使用すると、{...}R&\↰₁;R+2バイト節約されます。⟨≡{⟨t-h⟩ᵐ+}ᵐ\⟩+ オンライン
Kroppeb

ダブルマップ内のマップのマッピングを変更し、で連結してソムし、追加の2バイトを削除します⟨≡⟨t-h⟩ᵐ²\⟩c+オンラインでお試しください!
クロッペブ

@Kroppebそれは十分に異なっており、十分に大きく改善されているので、自分で新しい答えとして投稿する必要があります。あなたの提案を見ると、別の方法を使用した16バイトのソリューションのアイデアが得られました⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ 。オンラインで試してみてください!ので、代わりにこの回答をそのバージョンで更新します。
スンダ


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

@ Mr.Xcoderうーん..私は、デフォルトの入力によって許可されたものと思ったが、私はそこだと思う。この機能は...その後、再び、私は可能性として使用し、この無名の関数を呼び出し、これを定義があるSOGLに(「機能」■ functionNameSingleChar\n
dzaima

ああ大丈夫。それは完全に有効です。
Mr. Xcoder

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コロンがあります。
エソランジングフルーツ

0

MY、9バイト

ωΔω⍉Δ ḟΣ↵

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

チャットでデニスにpingしてMYをプルすることはできないため(一時停止のため)、これは現在機能しません。(Δ以前は減算時にvecifyしませんでした) デニスにMYをプルさせた人に感謝します!

どうやって?

  • ωΔ、最初のコマンドライン引数の増分
  • ω⍉Δ、最初のコマンドライン引数の転置の増分
  • 、単一のリスト
  • 、平坦化
  • Σ、合計
  • 、出力


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