Piega una matrice!


13

Data una matrice, sommare i suoi valori su / giù o sinistra / destra per formare una X, piegarla in alto e restituire l'elenco. Descrivo l'algoritmo qui:

Algoritmo

Il tuo input sarà una matrice quadrata di dimensioni dispari di numeri interi all'interno della ragionevole capacità numerica della tua lingua.

Prendiamo la seguente matrice come esempio:

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

Innanzitutto, aggiungi ogni numero al numero più vicino che si trova sulla diagonale principale o sull'antidiagonale. Cioè, dividi la matrice in quattro sezioni lungo la diagonale principale e l'antidiagonale, quindi somma tutti i numeri in ciascuna sezione verso il centro, in questo modo:

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

Questo passaggio fornisce il seguente risultato:

1        1
  5    5
    39
  17  15
0        5

Quindi, lo pieghiamo appiattendo la X e intrecciando gli elementi con il primo in alto a sinistra e l'ultimo in basso a sinistra. Questo dà il seguente risultato:

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

Puoi immaginarlo come allungare la diagonale principale e ruotarla in senso antiorario.

Questo è il risultato finale.

Sfida

Implementa questo algoritmo. Si applicano scappatoie standard. Sono accettabili tutti i formati I / O ragionevoli.

Casi test

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

È possibile aggiungere un caso di test matrice "non 5 × 5"?
totalmente umano l'

1
@icrieverytim ecco qui
HyperNeutrino,

Risposte:


7

JavaScript, 113 byte

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)


Umm .. perché il ~~? Si neutralizzano a vicenda, quindi non ce n'è bisogno.
Kevin Cruijssen,

2
@KevinCruijssen ~~undefined==0, quindi questo è più golfoso di (a[q]||0).
Neil,

@Neil Ah, non ci avevo pensato undefined. Quando ho copiato il test case usato da tsh , ho notato che funzionava senza ~~. E dato che ~~xsi -(-x)neutralizza in modo simile , ho pensato che fosse stato in qualche modo messo lì per caso. Grazie per la correzione.
Kevin Cruijssen,

5

Jelly , 25 23 21 byte

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

Provalo online!

Versione alternativa, 19 byte

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

Questo non funzionava perché si Ġcomportava in modo errato per le matrici nidificate. L'unica differenza è che le coppie [q, p] menzionate in Come funziona vengono ordinate lessicograficamente anziché mapparle p + nq prima dell'ordinamento.

Provalo online!

sfondo

Iniziamo sostituendo i suoi elementi con coordinate, aumentando verso sinistra e verso il basso e posizionandoli (0, 0) al centro della matrice.

Per una matrice 7x7 M , otteniamo le seguenti coordinate.

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

Ora calcoliamo il valore assoluto minimo di ciascuna coppia di coordinate e moltiplichiamo i segni di entrambe le coordinate per essa, mappando (i, j) a (segno (i) m, segno (j) m) , dove 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)

Gli elementi della matrice che corrispondono alla stessa coppia devono essere sommati. Per determinare l'ordine delle somme, mappiamo ciascuna coppia (p, q) di p + NQ , dove n è il numero di righe / colonne di 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

L'ordine delle somme corrisponde all'ordine degli interi che corrispondono alle sue somme.

Come funziona

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
è brillante.
Uriel,

5

Python, 159 158 byte

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]

Provalo online!


1
y+1+(y>l-2)può essere (y>l-2)-~y.
Jonathan Frech,


2

APL (Dyalog) , 60 byte *

In collaborazione con il mio collega Marshall .

Prefisso anonimo lambda. Prende la matrice come argomento e restituisce il vettore. Assume ⎕IO ( I NDICE O rigine) pari a zero, che è predefinita su molti sistemi.

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

Provalo online!

{... } lambda anonimo;è l'argomento giusto (come lettera più a destra dell'alfabeto greco):

⍴⍵ forma dell'argomento (elenco di due elementi identici)

r← memorizza come r(come in r ho)

 tutti ɩ ndices di un array di dimensione, cioè (0 0), (0 1)...

i← memorizzare in i(come nei OTA)

=/¨ Booleano dove le coordinate sono uguali (cioè la diagonale)

(...)  applica questa funzione di prefisso tacito anonimo:

   invertire l'argomento

  ⊢∨ O quello con l'argomento non modificato

, ravel (raddrizzare in un semplice elenco)

 Ora abbiamo una maschera booleana per le diagonali.

(... )/⍨ usalo per filtrare quanto segue:

  ⊢⍵ cedere (per separare da r) l'argomento

  {... }⌺r chiama la seguente infografica anonima lambda su ogni elemento, con r-neighbourhood (riempito con zeri se necessario) come argomento giusto ( ) e un elenco di due elementi di righe, colonne (negativo per il fondo / destra, zero per nessuno) come argomento sinistro ( ):

   r÷2 dividere rcon due

    scegli il primo elemento (sono identici)

    pavimentalo

   s← conservare come s(per s hape)

   i∊⍨¨ per ogni elemento di i, Boolean if sè un suo membro

   ⍵× moltiplicare il quartiere con ciò

   ()↓ Rilascia il seguente numero di righe e colonne (negativo per in basso / a destra):

    ×⍺ signum dell'argomento sinistro (cioè la direzione dei padding)

    - negare

     moltiplicarsi scon ciò

   , ravel (raddrizzare nell'elenco)

   +/ somma (più riduzione)

Ora abbiamo una matrice completa di somme, ma dobbiamo filtrare tutti i valori letti in senso colonna.

   trasporre

  , ravel (raddrizzare in un semplice elenco)


* Contando come ⎕U233A . Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.