Складіть матрицю!


13

Давши матрицю, підсумуйте її значення вгору / вниз або вліво / вправо, щоб утворити X, складіть його і поверніть список. Я описую алгоритм тут:

Алгоритм

Вашим вкладом буде квадратна матриця цілих розмірів цілих чисел у межах розумної числової ємності вашої мови.

Візьмемо для прикладу наступну матрицю:

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

Спочатку додайте кожне число до найближчого числа, яке знаходиться на головній діагоналі або антидіагоналі. Тобто, розділіть матрицю на чотири секції по головній діагоналі та антидіагоналі, а потім підсумовуйте всі числа в кожному розділі до центру, як:

1   2   3   2   1
    ↓   ↓   ↓    
0 → 3   2   3 ← 0
        ↓        
4 → 2 → 5 ← 6 ← 3
        ↑        
7 → 4   7   9 ← 4
    ↑   ↑   ↑    
0   6   7   2   5

Цей крок дає наступний результат:

1        1
  5    5
    39
  17  15
0        5

Потім ми складаємо його, вирівнюючи X і переплітаючи елементи спочатку вліво-вліво і внизу вліво. Це дає такий результат:

1, 0, 5, 17, 39, 5, 15, 1, 5

Ви можете уявити це як розтягування основної діагоналі та обертання її проти годинникової стрілки.

Це кінцевий результат.

Виклик

Реалізуйте цей алгоритм. Застосовуються стандартні лазівки. Усі прийнятні формати вводу / виводу прийнятні.

Випробування

Input
Output

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

1, 0, 5, 17, 39, 5, 15, 1, 5

1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0

1, 6, 11, 16, 47, 7, 22, 5, 0

1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9

1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9

Чи можете ви додати тестовий зразок матриці "не 5 × 5"?
повністюлюдсько

1
@icrieverytim тут ви йдете
HyperNeutrino

Відповіді:


7

JavaScript, 113 байт

s=>(l=s.length-1,a=[],s.map((v,y)=>v.map((n,x)=>a[q=2*[x,y,l-y].sort((u,v)=>u-v)[1]+(y>l/2),q-=q>l]=~~a[q]+n)),a)


Гм .. чому ~~? Вони нейтралізують один одного, тому в них немає потреби.
Кевін Кройсейсен

2
@KevinCruijssen ~~undefined==0, тож це гольфіст, ніж (a[q]||0).
Ніл

@Neil Ah, не думав про це undefined. Коли я скопіював тестовий випадок TSH використовується, я помітив , що працював без ~~. А оскільки ~~xподібне -(-x)нейтралізує одне одного, я подумав, що це якимось чином потрапило туди випадково. Дякуємо за виправлення.
Кевін Кройсейсен

5

Желе , 25 23 21 байт

AṂ×ṠṚ
LHŒRṗ2Ç€ḅLĠịFS€

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

Альтернативна версія, 19 байт

AṂ×ṠṚ
LHŒRṗ2Ç€ĠịFS€

Це не використовувалося для роботи, оскільки Ġповодилось неправильно для вкладених масивів. Єдина відмінність полягає в тому, що пари [q, p], згадані в « Як це працює» , сортуються лексикографічно, а не відображають їх до p + nq перед сортуванням.

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

Фон

Почнемо з заміни його елементів на координати, збільшення вліво та вниз і розміщення (0, 0) в центрі матриці.

Для матриці 7x7 M отримуємо такі координати.

(-3,-3) (-3,-2) (-3,-1) (-3, 0) (-3, 1) (-3, 2) (-3, 3)
(-2,-3) (-2,-2) (-2,-1) (-2, 0) (-2, 1) (-2, 2) (-2, 3)
(-1,-3) (-1,-2) (-1,-1) (-1, 0) (-1, 1) (-1, 2) (-1, 3)
( 0,-3) ( 0,-2) ( 0,-1) ( 0, 0) ( 0, 1) ( 0, 2) ( 0, 3)
( 1,-3) ( 1,-2) ( 1,-1) ( 1, 0) ( 1, 1) ( 1, 2) ( 1, 3)
( 2,-3) ( 2,-2) ( 2,-1) ( 2, 0) ( 2, 1) ( 2, 2) ( 2, 3)
( 3,-3) ( 3,-2) ( 3,-1) ( 3, 0) ( 3, 1) ( 3, 2) ( 3, 3)

Тепер обчислюємо мінімальне абсолютне значення кожної пари координат і множимо на них знаки обох координат, відображаючи (i, j) на (знак (i) m, знак (j) m) , де m = min (| i | , | j |) .

(-3,-3) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-3, 3)
(-2,-2) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-2, 2)
(-1,-1) (-1,-1) (-1,-1) ( 0, 0) (-1, 1) (-1, 1) (-1, 1)
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
( 1,-1) ( 1,-1) ( 1,-1) ( 0, 0) ( 1, 1) ( 1, 1) ( 1, 1)
( 2,-2) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 2, 2)
( 3,-3) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 3, 3)

Матричні елементи, які відповідають одній і тій же парі, повинні бути підсумовані. Для того, щоб визначити порядок сум, кожну пару (P, Q) , щоб р + NQ , де п є число рядків / стовпців М .

-24 -16  -8   0   6  12  18
-16 -16  -8   0   6  12  12
 -8  -8  -8   0   6   6   6
  0   0   0   0   0   0   0
 -6  -6  -6   0   8   8   8
-12 -12  -6   0   8  16  16
-18 -12  -6   0   8  16  24

Порядок сум відповідає порядку цілих чисел, відповідних його сумам.

Як це працює

LHŒRṗ2Ç€ḅLĠịFS€  Main link. Argument: M (matrix)

L                Compute n, the length (number of rows) of M.
 H               Halve it.
  ŒR             Symmetric range; map t to [-int(t), ..., 0, int(t)].
    ṗ2           Compute the second Cartesian power, yielding all pairs [i, j]
                 with -t ≤ i, j ≤ t.
      ǀ         Map the helper link over the resulting array of pairs.
         L       Yield n.
        ḅ        Unbase; map each pair [q, p] to (p + nq).
          Ġ      Group the indices of the resulting array of n² integers by their
                 corresponding values, ordering the groups by the values.
            F    Flatten M.
           ị     Index into the serialized matrix.
             S€  Compute the sum of each group.


AṂ×ṠṚ            Helper link. Argument: [i, j] (index pair)

A                Absolute value; yield [|i|, |j|].
 Ṃ               Minimum; yield m := min(|i|, |j|).
   Ṡ             Sign; yield [sign(i), sign(j)].
  ×              Multiply; yield [p, q] := [sign(i)m, sign(j)m].
    Ṛ            Reverse; yield [q, p].

5
це геніально.
Уріель



2

APL (Діалог) , 60 байт *

У співпраці з моїм колегою Маршаллом .

Анонімний префікс лямбда. Приймає матрицю як аргумент і повертає вектор. Передбачає ⎕IO ( I ndex O rigin) дорівнює нулю, що є типовим для багатьох систем.

{(,⍉{+/,(s×-×⍺)↓⍵×i∊¨⍨s←⌊⊃r÷2}⌺r⊢⍵)/⍨,(⊢∨⌽)=/¨i←⍳r←⍴⍵}

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

{} Анонімна лямбда; правильний аргумент (як найправіша літера грецького алфавіту):

⍴⍵ форма аргументу (список двох однакових елементів)

r← зберігати як r(як у r ho)

 все ɩ ndices масиву такого розміру, тобто (0 0), (0 1)...

i← зберігати в i(як в i ota)

=/¨ Булева, де координати рівні (тобто діагоналі)

() Застосувати цю функцію анонімного негласного префіксу:

   зворотний аргумент

  ⊢∨ АБО це з немодифікованим аргументом

, ravel (випряміть у простий список)

 Тепер у нас є булева маска для діагоналей.

()/⍨ Використовуйте це для фільтрування наступного:

  ⊢⍵ привести (відокремити r) аргумент

  {}⌺r Викличте наступну анонімну лямбда-інфіксацію на кожному елементі, при цьому r-neighbourhood ( підкреслений нулями, як необхідний) як аргумент ( ), та список двох елементів із рядками, стовпцями , що містять кількість елементів (мінус внизу / право, нуль для жодного) як лівий аргумент ( ):

   r÷2 ділити rна два

    виберіть перший елемент (вони однакові)

    пол

   s← зберігати як s(для s hape)

   i∊⍨¨ для кожного елемента iBoolean, якщо sє його членом

   ⍵× помножте сусідство з цим

   ()↓ Опустити наступну кількість рядків і стовпців (мінус внизу / праворуч):

    ×⍺ симптом лівого аргументу (тобто напрямок прокладки)

    - заперечувати

     багаторазово з sним

   , ravel (випрямити в список)

   +/ сума (плюс зменшення)

Тепер у нас є повна матриця сум, але нам потрібно відфільтрувати всі прочитані значення в стовпцях.

   переносити

  , ravel (випряміть у простий список)


* Відлічуючи як ⎕U233A . Спробуйте в Інтернеті!

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