Escalonar, apilar, suma

15

Inspirado por esta pregunta de desbordamiento de pila .

El reto

Entrada

Una matriz de matrices cuadradas que contienen enteros no negativos.

Salida

Una matriz cuadrada construida a partir de las matrices de entrada de la siguiente manera.

Sea el tamaño de cada matriz de entrada y el número de matrices de entrada.N×NP

Para mayor claridad, considere el siguiente ejemplo de matrices de entrada ( , ):N=2P=3

 3   5
 4  10

 6   8
12  11

 2   0
 9   1
  1. Comience con la primera matriz de entrada.
  2. Desplace la segunda matriz de entrada N −1 pasos hacia abajo y N −1 pasos hacia la derecha, de modo que su entrada superior izquierda coincida con la entrada inferior derecha de la anterior.
  3. Imagine la segunda matriz desplazada como si estuviera apilada encima de la primera. Suma los dos valores en la entrada coincidente. Escriba los otros valores y complete las entradas restantes con 0para obtener una matriz (2N1)×(2N1) . Con la entrada de ejemplo, el resultado hasta ahora es

     3   5   0
     4  16   8
     0  12  11
    
  4. Para cada matriz de entrada restante, escalónela de modo que su parte superior izquierda coincida con la parte inferior derecha de la matriz de resultados acumulada hasta el momento. En el ejemplo, incluir la tercera matriz de entrada da

     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  5. La salida es la matriz obtenida después de incluir la última matriz de entrada.((N1)P+1)×((N1)P+1)

Reglas y aclaraciones adicionales

Casos de prueba:

En cada caso, las matrices de entrada se muestran primero, luego la salida.

  1. norte=2 , :PAG=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. norte=2 , :PAG=1

     3   5
     4  10
    
     3   5
     4  10
    
  3. norte=1 , :PAG=4 4

     4
    
     7
    
    23
    
     5
    
    39
    
  4. norte=3 , :PAG=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. norte=2P = 4 , :PAG=4 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
    
Luis Mendo
fuente
¿Cuánto dura su solución MATL para esto?
Giuseppe
@Giuseppe No lo he probado en MATL. Para los casos de prueba, utilicé el código MATLAB de mi respuesta en la pregunta vinculada
Luis Mendo

Respuestas:

4

Jalea , 15 12 bytes

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

Pruébalo en línea!

Cómo funciona

⁹ṖŻ€ƒ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.
Dennis
fuente
6

R , 88 81 bytes

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}

Pruébalo en línea!

Toma una listde las matrices, A, N, y P.

Construye la matriz de ceros requerida oy agrega elementos a los contenidos de Alas submatrices apropiadas en o.

Giuseppe
fuente
4

JavaScript (ES6), 102 bytes

Toma entrada como (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))

Pruébalo en línea!

¿Cómo?

0 0w

w=(norte-1)×pag+1

(X,y)

sX,y=yo=0 0pag-1unyo(X-yo×(norte-1),y-yo×(norte-1))

donde las celdas indefinidas se reemplazan con ceros.

Arnauld
fuente
3

Python 2 , 124 bytes

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

Pruébalo en línea!

ovs
fuente
3

Jalea , 12 bytes

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

Pruébalo en línea!

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 bytes

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

Si se permitieron ceros adicionales, ZŻ€‘ɼ¡)⁺Ses una solución genial de 9 bytes. TIO .

dylnan
fuente
2

Python 2 , 124 bytes

def f(A,N,P):M=N-1;R=G(M*P+1);return[[sum(A[k][i-k*M][j-k*M]for k in G(P)if j<N+k*M>i>=k*M<=j)for j in R]for i in R]
G=range

Pruébalo en línea!

Chas Brown
fuente
1

Carbón , 52 bytes

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

Pruébalo en línea! El enlace es a una versión detallada del código e incluye dos bytes para un formato algo utilizable. Comencé con una versión que acolchaba todas las matrices y luego las resumí, pero pude jugar golf para que esta versión fuera más corta. Explicación:

≦⊖θ

norte

E⊕×θηE⊕×θη

(norte-1)PAG+1

ΣEEη×θξ

PAGnorte-1

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

Verifique que ninguno de los índices esté fuera de rango.

§§§ζξ⁻ιν⁻λν

Desplazamiento en la entrada original para obtener el valor deseado.

Neil
fuente