Підсумовуйте дельти моєї матриці


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х2 .

  • Ви можете взяти матрицю в будь-якому розумному форматі, поки ви її вказали.

  • Ви можете не припускати, що матриця квадратна.

  • Якщо це може допомогти вам зменшити кількість байтів, ви можете необов'язково взяти також кількість рядків і кількість стовпців як вхідні дані (Дивлячись на вас 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]] => 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 це дає список (кортежів, але це нормально), тому ми можемо додати (об'єднати) його в (з) 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

Оскільки мінімальний розмір вхідної матриці становить 2х2, 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 нічого не забув про це
Erik the Outgolfer


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

Брахілог , 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;

.tможе бути Cдля -1.
Ерік Аутгольфер

@EriktheOutgolfer О, вау, спасибі!

2

Брахілог , 22 16 байт

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

Спробуйте в Інтернеті!

(-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⟩ᵐ+}ᵐ\⟩+ Спробуйте в Інтернеті!
Кроппеб

Зміна відображення карти на подвійній карті та об'єднання та соммінг та видалення додаткових 2 байтів ⟨≡⟨t-h⟩ᵐ²\⟩c+. Спробуйте в Інтернеті!
Кроппеб

@Kroppeb Це достатньо різне і достатньо велике вдосконалення, що ви повинні опублікувати це як нову відповідь самостійно. Переглянувши ваші пропозиції, я дав ідею щодо 16-байтового рішення за допомогою іншого методу. ⟨≡{s₂ᶠc+ᵐ-}ᵐ\⟩+ṅ Спробуйте в Інтернеті! , тому замість цього я оновлю цю відповідь.
sundar


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

О, гаразд. Це цілком справедливо тоді.
Містер Xcoder

1

Математика, 45 байт

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

Вхідні дані

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


Чи буде коротше відняти перший з останнього для кожного масиву в {#,Transpose@#}(як моя відповідь Python)?
Джонатан Аллан

Total[Differences/@{#,Thread@#},3]&
алефальфа

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

МОЙ, 9 байт

ωΔω⍉Δ ḟΣ↵

Спробуйте в Інтернеті!

Оскільки я не можу пінг Денніса в чаті, щоб витягнути MY (через припинення), це наразі не вийде. ( Δраніше не відзначав при відніманні) Завдяки тому, хто змусив Денніса витягнути МОЮ!

Як?

  • ωΔ, з кроком першого аргументу командного рядка
  • ω⍉Δ, з кроком транспозиції аргументу першого командного рядка
  • , в єдиному списку
  • , сплющити
  • Σ, сума
  • , вихід


0

Піт , 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.