Somma delle matrici replicate


11

Dato un elenco di numeri [ a 1 a 2 ... a n ] , calcola la somma di tutte le matrici Aᵢ dove Aᵢ è definita come segue ( m è il massimo di tutte 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

Esempio

Dato l'input [2,1,3,1], costruiamo la seguente matrice:

[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]

Regole e I / O

  • si può presumere che l'input non sia vuoto
  • si può presumere che tutti gli input siano non negativi (0≤)
  • l'input può essere una matrice 1 × n (o n × 1), elenco, matrice ecc.
  • allo stesso modo l'output può essere una matrice, un elenco di elenchi, un array ecc.
  • è possibile acquisire e restituire input tramite qualsiasi formato I / O predefinito
  • l'invio può essere un programma o una funzione completi

Casi test

[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]]

Immagino che ci sia una differenza di carattere o qualcosa del genere. Vedo che hai eseguito il rollback della mia modifica. Ecco come mi sembra attualmente imgur.com/a06RH9r Questo è Chrome su Windows 10. Le ellissi verticali non vengono visualizzate in monospazio per qualche motivo e non si allineano con le colonne. Ecco perché l'ho cambiato. Ma immagino che debba apparire diverso in ambienti diversi.
ricorsivo

1
Sicuramente un problema con i caratteri. Entrambe le revisioni sono disallineate sul mio schermo.
Dennis,

Possiamo restituire il risultato trasposto?
Adám,


1
@Adám: sto per dire di no, ma sentiti libero di includere una soluzione nel tuo post.
ბიმო

Risposte:


9

Gelatina , 10 5 byte

ẋ"z0Ä

Provalo online!

Come funziona

ẋ"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]]

4

R , 80 byte

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

Provalo online!

Prende input da stdin; stampa una 0x1matrice per l'input 0, che viene stampata come

	[,1]


3
Per chi si chiede, Fè una variabile globale integrata il cui valore iniziale è FALSE. Qui è costretto a 0 e utilizzato come valore iniziale della somma cumulativa. Questa risposta dimostra il motivo per non usare Fe Ttranne nel codice specificamente progettato per non essere mai effettivamente utilizzato!
ngm


3

JavaScript (ES6), 88 79 byte

Restituisce []per [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)]:[]

Provalo online!


3

APL (Dyalog Unicode) , 8 byte SBCS

Programma completo. Richiede stdin per l'elenco, stampa la matrice su stdout.

Usa il metodo di Dennis .

+\⍉↑⍴⍨¨⎕

Provalo online!

 stdin

⍴⍨¨r eshape-selfie di ciascuno

 mescola elenco di liste in matrice, riempiendo con 0s

 trasporre

+\ somma cumulativa per riga

Il non fa alcuna differenza computazionale, quindi potrebbe potenzialmente essere tralasciata e \modificato per sommare colonna-saggio anziché row-wise.



2

Ottava , 64 byte

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

Provalo online!

Spiegazione:

Ancora una volta: le espressioni nella lista degli argomenti ed eval sono usate in una funzione :)

Questo prende xcome input e crea due matrici identiche piene di zeri, con le dimensioni k=a=zeros(length(x),max(x)). Ciò si ottiene aggiungendo il vettore orizzontale xcon un vettore verticale con 1:max(x), espandendo implicitamente le dimensioni in un array 2D, quindi moltiplicandolo per zero. ~(x+...)purtroppo non funziona, dal momento che forza aun array logico per tutto il resto della funzione.

for i=xè un ciclo che per ogni iterazione i=x(1), quindi i=x(2)e così via. a(1:i,k++:end)è la parte della matrice che deve essere aggiornata per ogni iterazione. 1:iè un vettore che dice quali righe devono essere aggiornate. Se i=0, allora questo sarà un vettore vuoto, quindi nulla verrà aggiornato, altrimenti lo è 1, 2 .... ++k:endincrementa la kmatrice di uno e crea un intervallo dal primo valore di questa matrice ( 1,2,3...) e fino all'ultima colonna della amatrice. +=iaggiunge il valore corrente a a. end,atermina il ciclo e le uscite a.




1

Java 10, 142 byte

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;}

Provalo online.

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


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.