Cambalear, empilhar, soma

15

Inspirado por esta questão do Stack Overflow .

O desafio

Entrada

Uma matriz de matrizes quadradas contendo números inteiros não negativos.

Resultado

Uma matriz quadrada construída a partir das matrizes de entrada da seguinte maneira.

Seja N×N o tamanho de cada matriz de entrada e P o número de matrizes de entrada.

Para maior clareza, considere o seguinte exemplo de matrizes de entrada ( N=2 , P=3 ):

 3   5
 4  10

 6   8
12  11

 2   0
 9   1
  1. Comece com a primeira matriz de entrada.
  2. Desloque a segunda matriz de entrada N -1 para baixo e N -1 para a direita, de modo que sua entrada superior esquerda coincida com a entrada inferior direita da anterior.
  3. Imagine a segunda matriz deslocada como se estivesse empilhada em cima da primeira. Soma os dois valores na entrada coincidente. Escreva os outros valores e preencha as entradas restantes 0para obter uma matriz (2N1)×(2N1) . Com a entrada de exemplo, o resultado até agora é

     3   5   0
     4  16   8
     0  12  11
    
  4. Para cada matriz de entrada restante, escalone-a para que sua parte superior esquerda coincida com a parte inferior direita da matriz de resultados acumulados até o momento. No exemplo, incluir a terceira matriz de entrada fornece

     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  5. A saída é a matriz ((N1)P+1)×((N1)P+1) obtida após a inclusão da última matriz de entrada.

Regras e esclarecimentos adicionais

Casos de teste:

Em cada caso, as matrizes de entrada são mostradas primeiro, depois a saída.

  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
fonte
Quanto tempo dura a sua solução MATL para isso?
Giuseppe
@ Giuseppe Eu não tentei em MATL. Para os casos de teste, usei o código MATLAB da minha resposta na pergunta vinculada
Luis Mendo

Respostas:

4

Geléia , 15 12 bytes

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

Experimente online!

Como funciona

⁹ṖŻ€ƒ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
fonte
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}

Experimente online!

Leva um list das matrizes, A, N, eP .

Constrói a matriz necessária de zeros oe adiciona elementwise o conteúdo das Asubmatrizes apropriadas emo .

Giuseppe
fonte
4

JavaScript (ES6), 102 bytes

Toma entrada como (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))

Experimente online!

Quão?

0 0W imediatamente:

W=(n-1)×p+1

Para cada célula em (x,y), calculamos:

sx,y=Eu=0 0p-1umaEu(x-Eu×(n-1),y-Eu×(n-1))

onde células indefinidas são substituídas por zeros.

Arnauld
fonte
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

Experimente online!

ovs
fonte
3

Gelatina , 12 bytes

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

Experimente 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

Se zeros extras forem permitidos, ZŻ€‘ɼ¡)⁺Sé uma solução legal de 9 bytes. TIO .

dylnan
fonte
2

Gelatina , 20 bytes

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

Experimente online!

Bah, Jelly tem uma atitude hoje ...

Erik, o Outgolfer
fonte
2

Pip , 37 bytes

{i:0{Y#i-1aM:0RLyAL_i+:yZG#@aALa}Mai}

Uma função que recebe uma lista de listas de listas. Experimente online!

DLosc
fonte
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

Experimente online!

Chas Brown
fonte
1

Carvão , 52 bytes

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

Experimente online! Link é uma versão detalhada do código e inclui dois bytes para formatação um tanto utilizável. Comecei com uma versão que preenchia todas as matrizes e as resumia, mas fui capaz de jogar essa versão para ser mais curta. Explicação:

≦⊖θ

Reduza o valor de entrada N.

E⊕×θηE⊕×θη

Calcular o tamanho do resultado (N-1)P+1 e mapeie o intervalo implícito duas vezes, produzindo assim uma matriz de resultados que é impressa de forma implícita.

ΣEEη×θξ

Mapear sobre o intervalo implícito sobre o valor de entrada P e multiplique cada elemento por N-1. Em seguida, mapeie o intervalo resultante e some o resultado final.

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

Verifique se nenhum dos índices está fora da faixa.

§§§ζξ⁻ιν⁻λν

Desloque a entrada original para buscar o valor desejado.

Neil
fonte