Przesunięcie, stos, suma

15

Zainspirowany przez tym pytaniem Przepełnienie stosu .

Wyzwanie

Wejście

Tablica kwadratowych macierzy zawierających nieujemne liczby całkowite.

Wynik

Matryca kwadratowa zbudowana z macierzy wejściowych w następujący sposób.

Niech N.×N. będzie rozmiarem każdej macierzy wejściowej, a P. liczbą macierzy wejściowych.

Dla jasności rozważmy następujące przykładowe macierze wejściowe ( N.=2) , P.=3) ):

 3   5
 4  10

 6   8
12  11

 2   0
 9   1
  1. Zacznij od pierwszej matrycy wejściowej.
  2. Przesuń drugą macierz wejściową N- 1 o krok w dół i N -1 kroki w prawo, tak aby jej górny lewy wpis pokrywa się z prawym dolnym wpisem poprzedniego.
  3. Wyobraź sobie drugą, przesuniętą matrycę, jakby była ułożona na górze pierwszej. Zsumuj dwie wartości przy wpisie zbiegu. Wpisz pozostałe wartości i wypełnij pozostałe wpisy, 0aby uzyskać macierz (2)N.-1)×(2)N.-1) . Z przykładowego wejścia wynik jest jak dotąd

     3   5   0
     4  16   8
     0  12  11
    
  4. Dla każdej pozostałej macierzy wejściowej ustaw ją tak, aby jej górna lewa część pokrywała się z dolną prawą zakumulowaną macierzą wyników do tej pory. W tym przykładzie, w tym trzecia macierz wejściowa daje

     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  5. Wyjście jest macierzą ((N.-1)P.+1)×((N.-1)P.+1) uzyskaną po uwzględnieniu ostatniej macierzy wejściowej.

Dodatkowe zasady i wyjaśnienia

Przypadki testowe:

W każdym przypadku najpierw wyświetlane są macierze wejściowe, a następnie dane wyjściowe.

  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
źródło
Jak długie jest twoje rozwiązanie MATL?
Giuseppe,
@Giuseppe Nie próbowałem tego w MATL. Dla przypadków testowych użyłem kodu MATLAB z mojej odpowiedzi w połączonym pytaniu
Luis Mendo

Odpowiedzi:

4

Galaretka , 15 12 bajtów

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

Wypróbuj online!

Jak to działa

⁹ṖŻ€ƒ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
źródło
6

R , 88 81 bajtów

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}

Wypróbuj online!

Trwa listmatryc A, Ni P.

Tworzy wymaganą macierz zer oi dodaje elementarnie zawartość Aodpowiednich podmacierzy w o.

Giuseppe
źródło
4

JavaScript (ES6), 102 bajty

Pobiera dane wejściowe jako (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))

Wypróbuj online!

W jaki sposób?

0w

w=(n-1)×p+1

(x,y)

sx,y=ja=0p-1zaja(x-ja×(n-1),y-ja×(n-1))

gdzie niezdefiniowane komórki są zastępowane zerami.

Arnauld
źródło
3

Python 2 , 124 bajty

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

Wypróbuj online!

ovs
źródło
3

Galaretka , 12 bajtów

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

Wypróbuj 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 bajtów

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

Jeśli dozwolone ZŻ€‘ɼ¡)⁺Ssą dodatkowe zera, to fajne 9-bajtowe rozwiązanie. TIO .

dylnan
źródło
2

Galaretka , 20 bajtów

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

Wypróbuj online!

Bah, Jelly ma dzisiaj postawę ...

Erik the Outgolfer
źródło
2

Python 2 , 124 bajty

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

Wypróbuj online!

Chas Brown
źródło
1

Węgiel , 52 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu i zawiera dwa bajty dla nieco użytecznego formatowania. Zacząłem od wersji, która wypełniała wszystkie tablice, a następnie je podsumowałam, ale zamiast tego byłam w stanie zagrać w golfa. Wyjaśnienie:

≦⊖θ

Zmniejsz wartość wejściową N..

E⊕×θηE⊕×θη

Oblicz rozmiar wyniku (N.-1)P.+1 i odwzorować dwukrotnie na niejawny zakres, tworząc w ten sposób macierz wyników, która jest drukowana w sposób niejawny.

ΣEEη×θξ

Odwzoruj na niejawny zakres powyżej wartości wejściowej P. i pomnóż każdy element przez N.-1. Następnie zmapuj wynikowy zakres i zsumuj wynik końcowy.

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

Sprawdź, czy żaden z indeksów nie jest poza zakresem.

§§§ζξ⁻ιν⁻λν

Przesunięcie do oryginalnego wejścia, aby pobrać żądaną wartość.

Neil
źródło