Summe der replizierten Matrizen

11

Berechnen Sie anhand einer Liste von Zahlen [ a 1 a 2 ... a n ] die Summe aller Matrizen Aᵢ, wobei Aᵢ wie folgt definiert ist ( m ist das Maximum aller 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

Beispiel

Ausgehend von der Eingabe erstellen [2,1,3,1]wir die folgende Matrix:

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

Regeln und E / A.

  • Sie können davon ausgehen, dass die Eingabe nicht leer ist
  • Sie können davon ausgehen, dass alle Eingänge nicht negativ sind (0 ≤).
  • Die Eingabe kann eine 1 × n (oder n × 1) Matrix, Liste, Array usw. sein.
  • Ebenso kann die Ausgabe eine Matrix, eine Liste von Listen, ein Array usw. sein.
  • Sie können Eingaben über ein beliebiges Standard-E / A-Format vornehmen und zurückgeben
  • Ihre Einreichung kann ein vollständiges Programm oder eine vollständige Funktion sein

Testfälle

[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]]
ბიმო
quelle
Ich vermute, es gibt einen Schriftunterschied oder so. Ich sehe, dass Sie meine Bearbeitung zurückgesetzt haben. So sieht es derzeit für mich aus imgur.com/a06RH9r Dies ist Chrome unter Windows 10. Die vertikalen Ellipsen werden aus irgendeinem Grund nicht in Monospace gerendert und stimmen nicht mit den Spalten überein . Deshalb habe ich es geändert. Aber ich denke, es muss in verschiedenen Umgebungen unterschiedlich aussehen.
rekursiv
1
Auf jeden Fall ein Schriftproblem. Beide Revisionen sind auf meinem Bildschirm falsch ausgerichtet.
Dennis
Dürfen wir das transponierte Ergebnis zurückgeben?
Adám
1
@ Adám: Ich werde nein dazu sagen, aber zögern Sie nicht, eine Lösung in Ihren Beitrag aufzunehmen, die dies tut.
23.

Antworten:

9

Gelee , 10 5 Bytes

ẋ"z0Ä

Probieren Sie es online aus!

Wie es funktioniert

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

Probieren Sie es online aus!

Nimmt Eingaben von stdin entgegen; druckt eine 0x1Matrix für die Eingabe 0, die wie folgt druckt

	[,1]

Giuseppe
quelle
3
Für diejenigen, die sich fragen, Fist eine integrierte globale Variable, deren Anfangswert ist FALSE. Hier wird es auf 0 gezwungen und als Anfangswert der kumulierten Summe verwendet. Diese Antwort zeigt den Grund für die Nichtverwendung Fund Taußer in Code, der speziell dafür entwickelt wurde, niemals tatsächlich verwendet zu werden!
ngm
4

Haskell , 70 66 51 Bytes

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

Probieren Sie es online aus!

Laikoni
quelle
1
Als Rätsel gibt es eine 54-Byte-Version;)
23
1
@BMO Wie wäre es stattdessen mit 51 Bytes?
Laikoni
Sehr schön! Meins war das :)
23
3

JavaScript (ES6), 88 79 Byte

Rückgabe []für [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)]:[]

Probieren Sie es online aus!

Arnauld
quelle
3

APL (Dyalog Unicode) , 8 Byte SBCS

Volles Programm. Fordert stdin zur Liste auf und druckt die Matrix in stdout.

Verwendet Dennis 'Methode .

+\⍉↑⍴⍨¨⎕

Probieren Sie es online aus!

 stdin

⍴⍨¨r eshape-selfie von jedem

 Liste der Listen in eine Matrix mischen und mit Nullen füllen

 transponieren

+\ kumulative zeilenweise Summe

Das macht keinen rechnerischen Unterschied, daher könnte es möglicherweise weggelassen und \geändert werden, um spaltenweise statt zeilenweise zu summieren.

Adam
quelle
2

Oktave , 64 Bytes

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

Probieren Sie es online aus!

Erläuterung:

Nochmals: Ausdrücke in der Argumentliste und in eval werden in einer Funktion verwendet :)

Dies nimmt xals Eingabe und erstellt zwei identische Matrizen, die mit Nullen gefüllt sind, mit den Dimensionen k=a=zeros(length(x),max(x)). Dies wird erreicht, indem der horizontale Vektor xmit einem vertikalen Vektor mit addiert wird 1:max(x), die Dimensionen implizit zu einem 2D-Array erweitert werden und dieser dann mit Null multipliziert wird. ~(x+...)funktioniert leider nicht, da dies zwangsläufig aein logisches Array für den Rest der Funktion darstellt.

for i=xist eine Schleife, die für jede Iteration i=x(1)dann i=x(2)und so weiter gemacht wird. a(1:i,k++:end)ist der Teil der Matrix, der für jede Iteration aktualisiert werden soll. 1:iist ein Vektor, der angibt, welche Zeilen aktualisiert werden sollen. Wenn i=0, dann ist dies ein leerer Vektor, daher wird nichts aktualisiert, sonst ist es 1, 2 .... ++k:enderhöht die kMatrix um eins und erstellt einen Bereich vom ersten Wert dieser Matrix ( 1,2,3...) bis zur letzten Spalte der aMatrix. +=ifügt den aktuellen Wert hinzu a. end,abeendet die Schleife und gibt aus a.

Stewie Griffin
quelle
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;}

Probieren Sie es online aus.

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
quelle