Sfalsa, impila, somma


15

Ispirato da questa domanda Stack Overflow .

La sfida

Ingresso

Un array di matrici quadrate contenenti numeri interi non negativi.

Produzione

Una matrice quadrata costruita dalle matrici di input come segue.

Sia la dimensione di ciascuna matrice di input e il numero di matrici di input.N×NP

Per chiarezza, considerare le seguenti matrici di input di esempio ( , ):N=2P=3

 3   5
 4  10

 6   8
12  11

 2   0
 9   1
  1. Inizia con la prima matrice di input.
  2. Sposta la seconda matrice di input N −1 passi in basso e N −1 passi a destra, in modo che la sua voce in alto a sinistra coincida con quella in basso a destra di quella precedente.
  3. Immagina la seconda matrice spostata come se fosse sovrapposta alla prima. Somma i due valori all'entrata coincidente. Scrivi gli altri valori e riempi le voci rimanenti con 0per ottenere una matrice . Con l'input di esempio, il risultato è finora(2N-1)×(2N-1)

     3   5   0
     4  16   8
     0  12  11
    
  4. Per ogni matrice di input rimanente, sfalsarla in modo che la sua parte superiore sinistra coincida con la parte inferiore destra della matrice del risultato accumulato finora. Nell'esempio, include la terza matrice di input

     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  5. L'uscita è la matrice ottenuta dopo aver incluso l'ultima matrice di input.((N-1)P+1)×((N-1)P+1)

Regole e chiarimenti aggiuntivi

Casi test:

In ogni caso, vengono mostrate prima le matrici di input, quindi l'output.

  1. N=2 , :P=3

     3   5
     4  10
    
     6   8
    12  11
    
     2   0
     9   1
    
     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  2. N=2 , :P=1

     3   5
     4  10
    
     3   5
     4  10
    
  3. N=1 , :P=4

     4
    
     7
    
    23
    
     5
    
    39
    
  4. N=3 , :P=2

    11  11   8
     6   8  12
    11   0   4
    
     4   1  13
     9  19  11
    13   4   2
    
    11  11   8   0   0
     6   8  12   0   0
    11   0   8   1  13
     0   0   9  19  11
     0   0  13   4   2
    
  5. N=2 , :P=4

    14  13
    10   0
    
    13  20
    21   3
    
     9  22
     0   8
    
    17   3
    19  16
    
    14  13   0   0   0
    10  13  20   0   0
     0  21  12  22   0
     0   0   0  25   3
     0   0   0  19  16
    

Quanto dura la tua soluzione MATL per questo?
Giuseppe,

@Giuseppe Non l'ho provato in MATL. Per i casi di test ho usato il codice MATLAB dalla mia risposta nella domanda collegata
Luis Mendo,

Risposte:


4

Gelatina , 15 12 byte

⁹ṖŻ€ƒZƲ⁺+µ@/

Provalo online!

Come funziona

⁹ṖŻ€ƒZƲ⁺+µ@/  Main link. Argument: A (array of matrices)

         µ    Begin a monadic chain.
          @/  Reduce A by the previous chain, with swapped arguments.
                Dyadic chain. Arguments: M, N (matrices)
      Ʋ           Combine the links to the left into a monadic chain with arg. M.
⁹                 Set the return value to N.
 Ṗ                Pop; remove its last row.
     Z            Zip; yield M transposed.
    ƒ             Fold popped N, using the link to the left as folding function and
                  transposed M as initial value.
  Ż€                Prepend a zero to each row of the left argument.
                    The right argument is ignored.
       ⁺        Duplicate the chain created by Ʋ.
        +       Add M to the result.

6

R , 88 81 byte

function(A,N,P,o=0*diag(P*(N-1)+1)){for(i in 1:P)o[x,x]=o[x<-1:N+i-1,x]+A[[i]];o}

Provalo online!

Prende una listdelle matrici, A, N, e P.

Costruisce la matrice richiesta di zeri oe aggiunge in modo elementare il contenuto delle Asottomaterie appropriate in o.


4

JavaScript (ES6), 102 byte

Accetta input come (n,p,a).

(n,p,a)=>[...Array(--n*p+1)].map((_,y,r)=>r.map((_,x)=>a.map((a,i)=>s+=(a[y-i*n]||0)[x-i*n]|0,s=0)|s))

Provalo online!

Come?

0w

w=(n-1)×p+1

(X,y)

SX,y=Σio=0p-1un'io(X-io×(n-1),y-io×(n-1))

dove le celle non definite vengono sostituite con zeri.


3

Python 2 , 124 byte

def f(m,N,P):w=~-N*P+1;a=[w*[0]for _ in' '*w];g=0;exec"x=g/N/N*~-N;a[x+g/N%N][x+g%N]+=m[x][g/N%N][g%N];g+=1;"*P*N*N;return a

Provalo online!


3

Gelatina , 12 byte

Z€Ż€’}¡"Jµ⁺S

Provalo online!

Z€Ż€’}¡"Jµ⁺S
         µ    Everything before this as a monad.
          ⁺   Do it twice
Z€            Zip €ach of the matrices
        J     1..P
       "      Pair the matrices with their corresponding integer in [1..P] then apply the 
              following dyad:
  Ż€            Prepend 0 to each of the rows
      ¡         Repeat this:
    ’}          (right argument - 1) number of times
              Doing everything before µ twice adds the appropriate number of rows and
              columns to each matrix. Finally:
           S  Sum the matrices.

12 byte

J’0ẋ;Ɱ"Z€µ⁺S

Se fossero consentiti zero aggiuntivi ZŻ€‘ɼ¡)⁺Sè una soluzione interessante a 9 byte. TIO .





1

Carbone , 52 byte

≦⊖θE⊕×θηE⊕×θηΣEEη×θξ∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν§§§ζξ⁻ιν⁻λν

Provalo online! Il collegamento è alla versione dettagliata del codice e include due byte per una formattazione piuttosto utilizzabile. Ho iniziato con una versione che riempiva tutti gli array e poi li sommava, ma sono stato in grado di golf questa versione per essere più corta. Spiegazione:

≦⊖θ

N

E⊕×θηE⊕×θη

(N-1)P+1

ΣEEη×θξ

PN-1

∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν

Verificare che nessuno degli indici sia fuori portata.

§§§ζξ⁻ιν⁻λν

Offset nell'input originale per recuperare il valore desiderato.

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.