Zsumuj delty mojej matrycy

17

tło

Delty tablicy liczb całkowitych to tablica utworzona przez uzyskanie różnic między kolejnymi elementami. Na przykład, [1, 2, 4, 7, 3, 9, 6]ma następujące delty: [1, 2, 3, -4, 6, -3].

Teraz zdefiniujemy delty macierzy liczb całkowitych jako delty każdego wiersza i każdej kolumny w nim zawartej.

Jako przykład:

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]

Co daje nam następującą listę delt macierzy:

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

A ponieważ nie chcemy, aby się zagnieżdżały, spłaszczamy tę listę:

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

Zadanie

Twoim zadaniem jest zsumowanie wszystkich delt macierzy podanej jako dane wejściowe. Zauważ, że macierz będzie się składać tylko z nieujemnych liczb całkowitych.

Zasady

  • Obowiązują wszystkie standardowe zasady.

  • Możesz założyć, że macierz zawiera co najmniej dwie wartości w każdym wierszu i kolumnie, więc minimalny rozmiar to 2x2 .

  • Możesz wziąć matrycę w dowolnym rozsądnym formacie, o ile ją określisz.

  • Nie można zakładać, że macierz jest kwadratowa.

  • Jeśli to może pomóc zmniejszyć liczbę bajtów, to może ewentualnie podjąć liczbę wierszy i liczbę kolumn jako wejście, jak również (patrzy na ciebie C!).

  • To jest code-golf, więc wygrywa najkrótszy kod (w bajtach) w każdym języku !

Przypadki testowe

Dane wejściowe => Dane wyjściowe

[[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]] => 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
Pan Xcoder
źródło

Odpowiedzi:

12

Python 2 , 42 bajty

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

Bezimienna funkcja pobierająca listę list mi zwracająca wynikową liczbę.

Wypróbuj online!

W jaki sposób?

Suma delt na liście to ostatni element minus pierwszy, wszystko inne po prostu anuluje:
(r [n] -r [n-1]) + (r [n-1] -r [n-2]) + ... + (r [2] -r [1]) = r [n] -r [1]

Do zip(*m)zastosowania rozpakowaniu ( *) z mprzejść rzędy modsunięte do zip(przeplotu), a zatem transpozycję macierzy. W Pythonie 2 daje to listę (krotek, ale to dobrze), więc możemy dodać (połączyć) do (z)m , przejść przez wszystkie nasze wiersze i kolumny r, wykonać powyższą sztuczkę dla każdego i po prostu dodać wyniki ( sum(...)).

Jonathan Allan
źródło
8

R , 34 bajty

function(m)sum(diff(m),diff(t(m)))

Wypróbuj online!

Funkcja anonimowa. Początkowo apply(m,1,diff)uzywałem różnic rzędowych (i 2zamiast 1kolumn), ale patrząc na odpowiedź Stewiego Griffina, wypróbowałem to diffi właśnie zadziałało.

Giuseppe
źródło
8

Oktawa , 33 bajty

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

Wypróbuj online!

Wyjaśnienie:

Jest to anonimowa funkcja przyjmująca xdane wejściowe. Pobiera różnicę między wszystkimi kolumnami i łączy ją z różnicą między kolumnami transponowanej x. Następnie sumuje ten wektor wzdłuż drugiego wymiaru.

Stewie Griffin
źródło
5

Galaretka , 5 bajtów

;ZIẎS

Wypróbuj online!

Istnieje również kilka wersji tylko ASCII: ;ZIFS ;ZISS

Erik the Outgolfer
źródło
5

JavaScript (ES6), 68 67 bajtów

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

Sformatowane i skomentowane

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

Ponieważ minimalny rozmiar matrycy wejściowej wynosi 2x2, m.map(...)|m[0].map(...)gwarantuje się przymus 0. Dlatego bezpiecznie można zwrócić wynik końcowy|s .

Przypadki testowe

Arnauld
źródło
5

MATL , 7 bajtów

dG!dhss

Wypróbuj online!

Wyjaśnienie:

Załóżmy, że dane wejściowe to

[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
Stewie Griffin
źródło
4

J , 14 bajtów

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

Wypróbuj online!

Wyjaśnienie

+/@,&({:-{.)|:  Input: matrix M
            |:  Transpose
     (     )    Operate on M and M'
      {:          Tail
        -         Minus
         {.       Head
   ,&           Join
+/@             Reduce by addition
mile
źródło
3

Łuska , 7 bajtów

ΣṁẊ-S+T

Wypróbuj online!

-1 dzięki Panu Xcoder biorąc moją uwagę od Sa ¤i kierunku m(co powinno już ).
-1 dzięki nadużyciom ZgarbS .

Wyjaśnienie:

ΣṁẊ-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
Erik the Outgolfer
źródło
Tak, 8 bajtów , przy użyciu .
Pan Xcoder,
Również 8 bajtów , zamiast tego wykorzystując podejście.
Pan Xcoder,
@ Mr.Xcoder wow zapomniał o tym
Erik the Outgolfer
3

APL, 18 15 bajtów

{-+/∊2-/¨⍵(⍉⍵)}

Wypróbuj online!

Zacharý
źródło
13 bajtów -+/∘∊(2-⍨/⍉⍪⊢)
Uriel,
@Uriel, który działa tylko dla macierzy kwadratowych
ngn 5'18
3

Haskell , 60 bajtów

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

Wypróbuj online! Używa krótszej transpozycji, którą znalazłem jakiś czas temu.

Wyjaśnienie

eto nieskończona lista pustych list i używana do transpozycji. zjest skrótem dla zipWithfunkcji, ponieważ jest używana dwukrotnie.

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
Laikoni
źródło
3

Brachylog , 13 bajtów

bazujący na projekcie @ sundar

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

Wyjaśnienie

⟨≡      \⟩          #   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)

⟨⟩są brudząc się formatowanie, przepraszam

Wypróbuj online!

Kroppeb
źródło
2

Pyth, 7 bajtów

ss.+M+C

Wypróbuj tutaj.

Moja pierwsza odpowiedź w języku golfowym! Dzięki @EriktheOutgolfer za -1 bajtów!

Wyjaśnienie

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;
Pan Xcoder
źródło
.tmoże być Cdla -1.
Erik the Outgolfer,
@EriktheOutgolfer Oh wow, dzięki!
2

Brachylog , 22 16 bajtów

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

Wypróbuj online!

(-6 bajtów inspirowanych sugestiami @ 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
sundar - Przywróć Monikę
źródło
Suma delt jest równa ostatniemu elementowi - pierwszy ⟨t-h⟩robi lewę. W rezultacie {⟨t-h⟩ᵐ+}R&\↰₁;R+jest o 5 bajtów krótszy. Wypróbuj online!
Kroppeb,
użycie ⟨≡{...}ᵐ\⟩+zamiast {...}R&\↰₁;R+zapisywania 2 bajtów. Wynik w ⟨≡{⟨t-h⟩ᵐ+}ᵐ\⟩+ Wypróbuj online!
Kroppeb,
Zmiana mapowania mapy na podwójnej mapie oraz konkatenacja i somming na i usuwa dodatkowe 2 bajty ⟨≡⟨t-h⟩ᵐ²\⟩c+. Wypróbuj online!
Kroppeb,
@Kroppeb Jest to na tyle inna i wystarczająco duża poprawa, że ​​sam powinieneś opublikować ją jako nową odpowiedź. Widok twoich sugestii dał mi pomysł na 16-bajtowe rozwiązanie przy użyciu innej metody ⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ Wypróbuj online! , więc zaktualizuję tę odpowiedź w tej wersji.
Sundar - Przywróć Monikę
2

Japt -x , 11 10 9 bajtów

cUy)®än x

Spróbuj


Wyjaśnienie

c             :Concatenate
 U            :  Input array
  y           :  Transpose
   )          :End concatenation
    ®         :Map
     än       :  Deltas
        x     :  Reduce by addition
              :Implicitly reduce by addition and output
Kudłaty
źródło
1

SOGL V0.12 , 9 bajtów

:⌡-≤H⌡-¹∑

Wypróbuj tutaj! ( dodano, ponieważ wymaga to danych wejściowych na stosie)

Wyjaśnienie:

:          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
dzaima
źródło
1
dodano, ponieważ wymaga to danych wejściowych na stosie - miałem na myśli to pytanie: czy dane wejściowe są automatycznie wypychane na stos? Jeśli tak nie jest i oczekuje, że dane wejściowe będą już obecne na stosie, czy nie powinieneś również dodać liczby bajtów? Nie jestem pewien, jak te sytuacje są obsługiwane. A może to jak funkcja?
Pan Xcoder,
@ Mr.Xcoder hmm .. Myślałem, że jest to dozwolone przez domyślne dane wejściowe, ale myślę, że jest tylko to dla funkcji .. Z drugiej strony, mógłbym nazwać to nienazwaną funkcją używaną jako to (w SOGL definicja „funkcji” to functionNameSingleChar\n)
dzaima,
Och w porządku. Jest to wtedy całkowicie poprawne.
Pan Xcoder,
1

Mathematica, 45 bajtów

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

Wejście

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

J42161217
źródło
Czy krótsze byłoby odjęcie pierwszego od ostatniego dla każdej tablicy {#,Transpose@#}(jak moja odpowiedź w języku Python)?
Jonathan Allan,
Total[Differences/@{#,Thread@#},3]&
alephalpha
1

CJam , 19 bajtów

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

Dane wejściowe to lista list liczb. Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
4
Ta odpowiedź wymaga więcej dwukropków. Są 2fewdwukropki.
Esolanging Fruit,
0

MY, 9 bajtów

ωΔω⍉Δ ḟΣ↵

Wypróbuj online!

Ponieważ nie mogę pingować Dennisa na czacie, aby pobrać MOJE (z powodu zawieszenia), obecnie nie będzie to działać. ( Δpoprzednio nie sprawdzał przy odejmowaniu) Dzięki komukolwiek Dennis wyciągnął MOJE!

W jaki sposób?

  • ωΔ, przyrosty pierwszego argumentu wiersza poleceń
  • ω⍉Δ, przyrosty transpozycji pierwszego argumentu wiersza poleceń
  • , na jednej liście
  • spłaszczyć
  • Σ, suma
  • , wynik
Zacharý
źródło
0

Pyt , 11 bajtów

Đ⊤ʁ-⇹ʁ-áƑƩ~

Wyjaśnienie:

          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
mudkip201
źródło