Złóż matrycę!

13

Biorąc pod uwagę macierz, zsumuj jej wartości w górę / w dół lub w lewo / w prawo, aby utworzyć X, złóż go i zwróć listę. Algorytm opisuję tutaj:

Algorytm

Twój wkład będzie nieparzystej kwadratowej macierzy liczb całkowitych w rozsądnej pojemności numerycznej twojego języka.

Jako przykład weźmy następującą macierz:

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

Najpierw dodaj każdą liczbę do najbliższej liczby znajdującej się na głównej przekątnej lub antydiagonalnej. Oznacza to, że podziel macierz na cztery sekcje wzdłuż głównej przekątnej i antydiagonalnej, a następnie zsumuj wszystkie liczby w każdej sekcji w kierunku środka, tak:

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

Ten krok daje następujący wynik:

1        1
  5    5
    39
  17  15
0        5

Następnie składamy go, spłaszczając X i przeplatając elementy najpierw lewym górnym i lewym dolnym końcem. Daje to następujący wynik:

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

Można to sobie wyobrazić jako rozciąganie głównej przekątnej i obracanie jej przeciwnie do ruchu wskazówek zegara.

To jest wynik końcowy.

Wyzwanie

Zaimplementuj ten algorytm. Obowiązują standardowe luki. Dopuszczalne są wszystkie rozsądne formaty We / Wy.

Przypadki testowe

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
HyperNeutrino
źródło
Czy możesz dodać przypadek testowy matrycy „nie 5 × 5”?
całkowicie ludzki,
1
@icrieverytim here you go
HyperNeutrino

Odpowiedzi:

7

JavaScript, 113 bajtów

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)

tsh
źródło
Umm .. dlaczego ~~? Neutralizują się nawzajem, więc nie ma takiej potrzeby.
Kevin Cruijssen
2
@KevinCruijssen ~~undefined==0, więc jest to bardziej golfowe niż (a[q]||0).
Neil,
@ Neil Ah, nie myślałem o tym undefined. Kiedy skopiowałem użyty przypadek testowy tsh , zauważyłem, że zadziałał bez ~~. A ponieważ ~~xpodobnie -(-x)wzajemnie się neutralizuję, doszedłem do wniosku, że w jakiś sposób został tam umieszczony przypadkowo. Dziękuję za poprawienie mnie.
Kevin Cruijssen
5

Galaretka , 25 23 21 bajtów

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

Wypróbuj online!

Alternatywna wersja, 19 bajtów

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

Nie działało to, ponieważ działało Ġnieprawidłowo dla zagnieżdżonych tablic. Jedyna różnica polega na tym, że pary [q, p] wymienione w części Jak to działa są sortowane leksykograficznie zamiast mapowania ich na p + nq przed sortowaniem.

Wypróbuj online!

tło

Zaczynamy od zastąpienia jego elementów współrzędnymi, zwiększenia w lewo i w dół oraz umieszczenia (0, 0) na środku matrycy.

Dla macierzy M 7x7 otrzymujemy następujące współrzędne.

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

Teraz obliczamy minimalną wartość bezwzględną każdej pary współrzędnych i mnożymy przez nią znaki obu współrzędnych, odwzorowując (i, j) na (znak (i) m, znak (j) m) , gdzie 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)

Elementy macierzy, które odpowiadają tej samej parze, muszą zostać zsumowane. Aby określić kolejność sumy, to mapa każdej pary (p, q) do p + nq , gdzie n jest liczbą / kolumny M .

-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

Kolejność sum odpowiada kolejności liczb całkowitych i odpowiada jej sumom.

Jak to działa

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].
Dennis
źródło
5
To jest genialne.
Uriel
5

Python, 159 158 bajtów

def f(m):l=len(m)-1;r=range(1,l);return m[0][::l]+f([[sum(m[x][1%y*y:(y>l-2)-~y])+m[0][y]*(x<2)+m[l][y]*(x>l-2)for y in r]for x in r])+m[l][::l]if l else m[0]

Wypróbuj online!

KSab
źródło
1
y+1+(y>l-2)może być (y>l-2)-~y.
Jonathan Frech
2

APL (Dyalog) , 60 bajtów *

We współpracy z moim kolegą Marshallem .

Anonimowy przedrostek lambda. Bierze macierz jako argument i zwraca wektor. Zakłada ⎕IO ( I ndex O rigin) na zero, co jest domyślne w wielu systemach.

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

Wypróbuj online!

{} Anonimowa lambda; ma słuszny argument (jak najdalsza litera alfabetu greckiego):

⍴⍵ kształt argumentu (lista dwóch identycznych elementów)

r← zapisz jako r(jak w r ho)

 Wszystkie ɩ ndices tablicy tej wielkości, to znaczy (0 0), (0 1)...

i← przechowywać w i(jak w i ota)

=/¨ Boolean, w którym współrzędne są równe (tj. Przekątna)

() Zastosuj tę anonimową funkcję ukrytego przedrostka:

   odwrócić argument

  ⊢∨ LUB to z niemodyfikowanym argumentem

, ravel (wyprostuj do prostej listy)

 Mamy teraz logiczną maskę przekątnych.

()/⍨ Użyj tego do filtrowania następujących elementów:

  ⊢⍵ wydaj (aby oddzielić r) argument

  {… Wywołaj }⌺r następującą anonimową infix lambda na każdym elemencie, z rargumentem -neighbourhood (wypełnione zerami w razie potrzeby) jako prawym argumentem ( ) i dwuelementową listą wypełnionych liczbami wierszy, kolumn (ujemny dla dolnego / prawego, zero dla braku) jako left argument ( ):

   r÷2 podzielić na rdwa

    wybierz pierwszy element (są identyczne)

    piętro to

   s← magazyn s(na s HAPE)

   i∊⍨¨ dla każdego elementu iBoolean, jeśli sjest jego członkiem

   ⍵× pomnóż przez to okolicę

   ()↓ Upuść następującą liczbę wierszy i kolumn (ujemną dla dolnego / prawego):

    ×⍺ podpis lewego argumentu (tj. kierunek wypełnień)

    - negować

     pomnożyć sz tym

   , ravel (wyprostuj na liście)

   +/ suma (plus zniżka)

Teraz mamy pełną macierz sum, ale musimy przefiltrować wszystkie wartości odczytane w kolumnie.

   transponować

  , ravel (wyprostuj do prostej listy)


* Licząc jako ⎕U233A . Wypróbuj online!

Adám
źródło