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

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

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]


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



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.



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.




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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.