Suma de matrices replicadas

11

Dada una lista de números [ a 1 a 2 ... a n ] , calcule la suma de todas las matrices Aᵢ donde Aᵢ se define de la siguiente manera ( m es el máximo de todos aᵢ ):

       1  2  ⋯ (i-1) i (i+1) ⋯  n
     +----------------------------
 1   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
 2   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
 .   . .  .      .   .   .      .
 .   . .  .      .   .   .      .
aᵢ   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
aᵢ₊₁ | 0  0  ⋯   0   0   0   ⋯  0
 .   . .  .      .   .   .      .
 .   . .  .      .   .   .      .
 m   | 0  0  ⋯   0   0   0   ⋯  0

Ejemplo

Dada la entrada [2,1,3,1], construimos la siguiente matriz:

[2 2 2 2]   [0 1 1 1]   [0 0 3 3]   [0 0 0 1]   [2 3 6 7]
[2 2 2 2] + [0 0 0 0] + [0 0 3 3] + [0 0 0 0] = [2 2 5 5]
[0 0 0 0]   [0 0 0 0]   [0 0 3 3]   [0 0 0 0]   [0 0 3 3]

Reglas y E / S

  • puede suponer que la entrada no está vacía
  • puede suponer que todas las entradas son no negativas (0≤)
  • la entrada puede ser una matriz, lista, matriz, etc. de 1 × n (o n × 1)
  • Del mismo modo, la salida puede ser una matriz, una lista de listas, una matriz, etc.
  • puede tomar y devolver entradas a través de cualquier formato de E / S predeterminado
  • su presentación puede ser un programa o función completa

Casos de prueba

[0] -> [] or [[]]
[1] -> [[1]]
[3] -> [[3],[3],[3]]
[2,2] -> [[2,4],[2,4]]
[3,0,0] -> [[3,3,3],[3,3,3],[3,3,3]]
[1,2,3,4,5] -> [[1,3,6,10,15],[0,2,5,9,14],[0,0,3,7,12],[0,0,0,4,9],[0,0,0,0,5]]
[10,1,0,3,7,8] -> [[10,11,11,14,21,29],[10,10,10,13,20,28],[10,10,10,13,20,28],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,10,18],[10,10,10,10,10,10],[10,10,10,10,10,10]]
ბიმო
fuente
Supongo que hay una diferencia de fuente o algo así. Te veo revertir mi edición. Así es como me parece actualmente imgur.com/a06RH9r Esto es Chrome en Windows 10. Las elipses verticales no se representan en el monoespacio por alguna razón, y no se alinean con las columnas. Por eso lo cambié. Pero supongo que debe verse diferente en diferentes entornos.
recursivo
1
Definitivamente un problema de fuente. Ambas revisiones están desalineadas en mi pantalla.
Dennis
¿Podemos devolver el resultado transpuesto?
Adám
1
@ Adám: Voy a decir que no a eso, sin embargo, siéntase libre de incluir una solución en su publicación que lo haga.
ბიმო

Respuestas:

9

Jalea , 10 5 bytes

ẋ"z0Ä

Pruébalo en línea!

Cómo funciona

ẋ"z0Ä  Main link. Argument: A (array)


       e.g. [2, 1, 3, 1]

ẋ"     Repeat each n in A n times.

       e.g. [[2, 2   ]
             [1      ]
             [3, 3, 3]
             [1      ]]

  z0   Zipfill 0; read the result by columns, filling missing elements with 0's.

        e.g. [[2, 1, 3, 1]
              [2, 0, 3, 0]
              [0, 0, 3, 0]]

    Ä  Take the cumulative sum of each row vector.

       e.g. [[2, 3, 6, 7]
             [2, 2, 5, 5]
             [0, 0, 3, 3]]
Dennis
fuente
4

R , 80 bytes

n=sum((a=scan())|1);for(i in 1:n)F=F+`[<-`(matrix(0,max(a),n),0:a[i],i:n,a[i]);F

Pruébalo en línea!

Toma entrada de stdin; imprime una 0x1matriz para entrada 0, que se imprime como

	[,1]

Giuseppe
fuente
3
Para aquellos que se preguntan, Fes una variable global incorporada cuyo valor inicial es FALSE. Aquí se coacciona a 0 y se usa como el valor inicial de la suma acumulativa. ¡Esta respuesta demuestra la razón para no usar Fy Texcepto en un código específicamente diseñado para nunca ser usado realmente!
ngm
4

Haskell , 70 66 51 bytes

g x=[scanl1(+)[sum[n|n>=r]|n<-x]|r<-[1..maximum x]]

Pruébalo en línea!

Laikoni
fuente
1
Como rompecabezas, hay una versión de 54 bytes;)
ბიმო
1
@BMO ¿Qué tal 51 bytes en su lugar?
Laikoni
¡Muy agradable! El mío fue esto :)
ბიმო
3

JavaScript (ES6), 88 79 bytes

Devoluciones []para [0].

f=(a,y,b=a.map((_,x)=>a.map(c=>y>=c|x--<0?0:s+=c,s=0)|s))=>s?[b,...f(a,-~y)]:[]

Pruébalo en línea!

Arnauld
fuente
3

APL (Dyalog Unicode) , SBCS de 8 bytes

Programa completo Solicita stdin para la lista, imprime la matriz en stdout.

Utiliza el método de Dennis .

+\⍉↑⍴⍨¨⎕

Pruébalo en línea!

 stdin

⍴⍨¨r eshape-selfie de cada

 mezclar lista de listas en matriz, llenando con ceros

 transponer

+\ suma acumulativa por filas

El no hace ninguna diferencia computacional, por lo que podría omitirse y \cambiarse a suma en columnas en lugar de en filas.

Adán
fuente
2

Octava , 64 bytes

@(x,k=a=0*(x+(1:max(x))'))eval"for i=x;a(1:i,++k:end)+=i;end,a";

Pruébalo en línea!

Explicación:

Una vez más: las expresiones en la lista de argumentos y eval se usan en una función :)

Esto toma xcomo entrada y crea dos matrices idénticas llenas de ceros, con las dimensiones k=a=zeros(length(x),max(x)). Esto se logra agregando el vector horizontal xcon un vector vertical con 1:max(x), expandiendo implícitamente las dimensiones a una matriz 2D, y luego multiplicándolo con cero. ~(x+...)desafortunadamente no funciona, ya que eso obliga aa ser una matriz lógica en el resto de la función.

for i=xes un bucle que hace cada iteración i=x(1), i=x(2)y así sucesivamente. a(1:i,k++:end)es la parte de la matriz que debe actualizarse para cada iteración. 1:ies un vector que dice qué filas deben actualizarse. Si i=0, entonces será un vector vacío, por lo tanto, no se actualizará nada, de lo contrario es 1, 2 .... ++k:endincrementa la kmatriz en uno y crea un rango desde el primer valor de esta matriz ( 1,2,3...) hasta la última columna de la amatriz. +=iagrega el valor actual a a. end,atermina el ciclo y sale a.

Stewie Griffin
fuente
1

Java 10, 142 bytes

a->{int l=a.length,i=0,j,s,m=0;for(int q:a)m=q>m?q:m;int[][]r=new int[m][l];for(;i<m;i++)for(j=s=0;j<l;j++)r[i][j]=s+=i<a[j]?a[j]:0;return r;}

Pruébalo en línea.

a->{               // Method with integer-array parameter and integer-matrix return-type
  int l=a.length,  //  Length of the input-array
      i,j,         //  Index integers
      s,           //  Sum integer
  m=0;for(int q:a)m=q>m?q:m;
                   //  Determine the maximum of the input-array
  int[][]r=new int[m][l];
                   //  Result-matrix of size `m` by `l`
  for(;i<m;i++)    //  Loop `i` over the rows
    for(j=s=0;     //   Reset the sum to 0
        j<l;j++)   //   Inner loop `j` over the columns
      r[i][j]=s+=  //    Add the following to the sum `s`, add set it as current cell:
        i<a[j]?    //     If the row-index is smaller than the `j`'th value in the input:
         a[j]      //      Add the current item to the sum
        :          //     Else:
         0;        //      Leave the sum the same by adding 0
  return r;}       //  Return the result-matrix
Kevin Cruijssen
fuente