Staffeln, stapeln, summieren

15

Inspiriert von dieser Stapelüberlauf-Frage .

Die Herausforderung

Eingang

Ein Array von quadratischen Matrizen, die nicht negative ganze Zahlen enthalten.

Ausgabe

Eine quadratische Matrix, die wie folgt aus den Eingangsmatrizen aufgebaut ist.

Sei die Größe jeder Eingangsmatrix und die Anzahl der Eingangsmatrizen.N×NP

Betrachten Sie zur Verdeutlichung die folgenden Beispiel-Eingabematrizen ( , ):N=2P=3

 3   5
 4  10

 6   8
12  11

 2   0
 9   1
  1. Beginnen Sie mit der ersten Eingabematrix.
  2. Verschieben Sie die zweite Eingabematrix N - 1 Schritte nach unten und N - 1 Schritte nach rechts, so dass ihr linker oberer Eintrag mit dem rechten unteren Eintrag des vorherigen übereinstimmt.
  3. Stellen Sie sich die zweite verschobene Matrix so vor, als ob sie über der ersten gestapelt wäre. Summieren Sie die beiden Werte bei der übereinstimmenden Eingabe. Schreiben Sie die anderen Werte und füllen Sie die restlichen Einträge mit 0, um eine Matrix zu erhalten. Bei der Beispieleingabe ist das bisherige Ergebnis(2N-1)×(2N-1)

     3   5   0
     4  16   8
     0  12  11
    
  4. Versetzen Sie die verbleibenden Eingabematrizen so, dass ihre obere linke Seite mit der unteren rechten Seite der akkumulierten Ergebnismatrix übereinstimmt. Im Beispiel ergibt sich einschließlich der dritten Eingabematrix

     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  5. Die Ausgabe ist die Matrix, die nach Einbeziehen der letzten Eingabematrix erhalten wird.((N-1)P+1)×((N-1)P+1)

Zusätzliche Regeln und Erläuterungen

Testfälle:

In jedem Fall werden zuerst Eingabematrizen und dann die Ausgabe angezeigt.

  1. N=2 , :P=3

     3   5
     4  10
    
     6   8
    12  11
    
     2   0
     9   1
    
     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  2. N=2 , :P=1

     3   5
     4  10
    
     3   5
     4  10
    
  3. N=1 , :P=4

     4
    
     7
    
    23
    
     5
    
    39
    
  4. N=3 , :P=2

    11  11   8
     6   8  12
    11   0   4
    
     4   1  13
     9  19  11
    13   4   2
    
    11  11   8   0   0
     6   8  12   0   0
    11   0   8   1  13
     0   0   9  19  11
     0   0  13   4   2
    
  5. N=2 , :P=4

    14  13
    10   0
    
    13  20
    21   3
    
     9  22
     0   8
    
    17   3
    19  16
    
    14  13   0   0   0
    10  13  20   0   0
     0  21  12  22   0
     0   0   0  25   3
     0   0   0  19  16
    
Luis Mendo
quelle
Wie lange ist Ihre MATL-Lösung dafür?
Giuseppe
@ Giuseppe Ich habe es nicht in MATL versucht. Für die Testfälle habe ich den MATLAB-Code aus meiner Antwort in der verknüpften Frage
Luis Mendo

Antworten:

4

Jelly , 15 12 Bytes

⁹ṖŻ€ƒZƲ⁺+µ@/

Probieren Sie es online!

Wie es funktioniert

⁹ṖŻ€ƒZƲ⁺+µ@/  Main link. Argument: A (array of matrices)

         µ    Begin a monadic chain.
          @/  Reduce A by the previous chain, with swapped arguments.
                Dyadic chain. Arguments: M, N (matrices)
      Ʋ           Combine the links to the left into a monadic chain with arg. M.
⁹                 Set the return value to N.
 Ṗ                Pop; remove its last row.
     Z            Zip; yield M transposed.
    ƒ             Fold popped N, using the link to the left as folding function and
                  transposed M as initial value.
  Ż€                Prepend a zero to each row of the left argument.
                    The right argument is ignored.
       ⁺        Duplicate the chain created by Ʋ.
        +       Add M to the result.
Dennis
quelle
6

R , 88 81 Bytes

function(A,N,P,o=0*diag(P*(N-1)+1)){for(i in 1:P)o[x,x]=o[x<-1:N+i-1,x]+A[[i]];o}

Probieren Sie es online!

Nimmt eine listvon Matrizen A, Nund P.

Erstellt die erforderliche Nullmatrix ound fügt den Inhalt Ader entsprechenden Untermatrizen in elementweise hinzu o.

Giuseppe
quelle
4

JavaScript (ES6), 102 Byte

Übernimmt die Eingabe als (n,p,a).

(n,p,a)=>[...Array(--n*p+1)].map((_,y,r)=>r.map((_,x)=>a.map((a,i)=>s+=(a[y-i*n]||0)[x-i*n]|0,s=0)|s))

Probieren Sie es online!

Wie?

0w

w=(n-1)×p+1

(x,y)

sx,y=ich=0p-1einich(x-ich×(n-1),y-ich×(n-1))

Dabei werden undefinierte Zellen durch Nullen ersetzt.

Arnauld
quelle
3

Python 2 , 124 Bytes

def f(m,N,P):w=~-N*P+1;a=[w*[0]for _ in' '*w];g=0;exec"x=g/N/N*~-N;a[x+g/N%N][x+g%N]+=m[x][g/N%N][g%N];g+=1;"*P*N*N;return a

Probieren Sie es online!

ovs
quelle
3

Gelee , 12 Bytes

Z€Ż€’}¡"Jµ⁺S

Probieren Sie es online!

Z€Ż€’}¡"Jµ⁺S
         µ    Everything before this as a monad.
          ⁺   Do it twice
Z€            Zip €ach of the matrices
        J     1..P
       "      Pair the matrices with their corresponding integer in [1..P] then apply the 
              following dyad:
  Ż€            Prepend 0 to each of the rows
      ¡         Repeat this:
    ’}          (right argument - 1) number of times
              Doing everything before µ twice adds the appropriate number of rows and
              columns to each matrix. Finally:
           S  Sum the matrices.

12 Bytes

J’0ẋ;Ɱ"Z€µ⁺S

Wenn zusätzliche Nullen zulässig sind, ZŻ€‘ɼ¡)⁺Sist dies eine coole 9-Byte-Lösung. TIO .

dylnan
quelle
2

Gelee , 20 Bytes

µ;€0Zð⁺0ṁ+ṚU$}ṚU+⁸µ/

Probieren Sie es online!

Bah, Jelly hat heute eine Einstellung ...

Erik der Outgolfer
quelle
2

Python 2 , 124 Bytes

def f(A,N,P):M=N-1;R=G(M*P+1);return[[sum(A[k][i-k*M][j-k*M]for k in G(P)if j<N+k*M>i>=k*M<=j)for j in R]for i in R]
G=range

Probieren Sie es online!

Chas Brown
quelle
1

Holzkohle , 52 Bytes

≦⊖θE⊕×θηE⊕×θηΣEEη×θξ∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν§§§ζξ⁻ιν⁻λν

Probieren Sie es online! Der Link ist eine ausführliche Version des Codes und enthält zwei Bytes für eine etwas brauchbare Formatierung. Ich begann mit einer Version, die alle Arrays auffüllte und dann summierte, aber ich konnte diese Version kürzer spielen. Erläuterung:

≦⊖θ

N

E⊕×θηE⊕×θη

(N-1)P+1

ΣEEη×θξ

PN-1

∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν

Stellen Sie sicher, dass keiner der Indizes außerhalb des Bereichs liegt.

§§§ζξ⁻ιν⁻λν

In die ursprüngliche Eingabe versetzen, um den gewünschten Wert abzurufen.

Neil
quelle