Somme des matrices répliquées

11

Étant donné une liste de nombres [ a 1 a 2 ... a n ] , calculez la somme de toutes les matrices AᵢAᵢ est définie comme suit ( m est le maximum de tous 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

Exemple

Compte tenu de l'entrée, [2,1,3,1]nous construisons la matrice suivante:

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

Règles et E / S

  • vous pouvez supposer que l'entrée n'est pas vide
  • vous pouvez supposer que toutes les entrées sont non négatives (0≤)
  • l'entrée peut être une matrice 1 × n (ou n × 1), une liste, un tableau, etc.
  • de même, la sortie peut être une matrice, une liste de listes, un tableau, etc.
  • vous pouvez prendre et renvoyer des entrées via n'importe quel format d'E / S par défaut
  • votre soumission peut être un programme ou une fonction complète

Cas de 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]]
ბიმო
la source
Je suppose qu'il y a une différence de police ou quelque chose. Je vois que vous avez annulé ma modification. Voici à quoi cela ressemble actuellement pour moi imgur.com/a06RH9r Il s'agit de Chrome sur Windows 10. Les ellipses verticales ne sont pas rendues en monospace pour une raison quelconque et ne s'alignent pas avec les colonnes. Voilà pourquoi je l'ai changé. Mais je suppose que cela doit être différent dans différents environnements.
récursif
1
Certainement un problème de police. Les deux révisions sont mal alignées sur mon écran.
Dennis
Peut-on rendre le résultat transposé?
Adám
1
@ Adám: Je vais dire non, mais n'hésitez pas à inclure une solution dans votre message qui le fait.
ბიმო

Réponses:

9

Gelée , 10 5 octets

ẋ"z0Ä

Essayez-le en ligne!

Comment ça fonctionne

ẋ"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
la source
4

R , 80 octets

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

Essayez-le en ligne!

Prend l'entrée de stdin; imprime une 0x1matrice d'entrée 0, qui s'imprime comme

	[,1]

Giuseppe
la source
3
Pour ceux qui se demandent, Fest une variable globale intégrée dont la valeur initiale est FALSE. Ici, il est contraint à 0 et utilisé comme valeur initiale de la somme cumulée. Cette réponse démontre la raison de ne pas utiliser Fet Tsauf dans un code spécialement conçu pour ne jamais être réellement utilisé!
ngm
4

Haskell , 70 66 51 octets

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

Essayez-le en ligne!

Laikoni
la source
1
Comme un casse - tête, il existe une version 54 octets;)
ბიმო
1
@BMO Que diriez-vous de 51 octets à la place?
Laikoni
Très agréable! Le mien était ce :)
ბიმო
3

JavaScript (ES6), 88 79 octets

Retourne []pour [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)]:[]

Essayez-le en ligne!

Arnauld
la source
3

APL (Dyalog Unicode) , 8 octets SBCS

Programme complet. Demande stdin pour la liste, imprime la matrice sur stdout.

Utilise la méthode de Dennis .

+\⍉↑⍴⍨¨⎕

Essayez-le en ligne!

 stdin

⍴⍨¨r eshape-selfie de chacun

 mélanger la liste des listes dans la matrice, en remplissant avec 0

 transposer

+\ somme cumulée par ligne

Le ne fait pas de différence de calcul, il pourrait être laissé et \changé pour résumer en colonne au lieu de la ligne sage.

Adam
la source
2

Python 2 , 85 octets

lambda x:[[sum(n*(n>j)for n in x[:i+1])for i in range(len(x))]for j in range(max(x))]

Essayez-le en ligne!

Barre
la source
2

Octave , 64 octets

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

Essayez-le en ligne!

Explication:

Encore une fois: les expressions dans la liste d'arguments et eval sont utilisées dans une fonction :)

Cela prend xen entrée et crée deux matrices identiques remplies de zéros, avec les dimensions k=a=zeros(length(x),max(x)). Ceci est réalisé en ajoutant le vecteur horizontal xavec un vecteur vertical avec 1:max(x), en étendant implicitement les dimensions à un tableau 2D, puis en multipliant cela par zéro. ~(x+...)ne fonctionne malheureusement pas, car cela oblige aà être un tableau logique dans le reste de la fonction.

for i=xest une boucle que fait pour chaque itération i=x(1), i=x(2)et ainsi de suite. a(1:i,k++:end)est la partie de la matrice qui doit être mise à jour pour chaque itération. 1:iest un vecteur indiquant quelles lignes doivent être mises à jour. Si i=0, alors ce sera un vecteur vide, donc rien ne sera mis à jour, sinon c'est le cas 1, 2 .... ++k:endincrémente la kmatrice d'une unité et crée une plage à partir de la première valeur de cette matrice ( 1,2,3...) et jusqu'à la dernière colonne de la amatrice. +=iajoute la valeur actuelle à a. end,atermine la boucle et les sorties a.

Stewie Griffin
la source
1

Java 10, 142 octets

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

Essayez-le en ligne.

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
la source