Soma da primeira linha e coluna, depois da segunda linha e coluna ... e assim por diante

31

Pegue uma matriz numérica / matriz não vazia contendo números inteiros positivos como entrada. Retorne, nessa ordem, as somas da primeira linha e coluna, depois a segunda linha e coluna e continue até que não haja mais linhas ou colunas.

Suponha que a entrada seja:

2   10   10    2    4
9    7    7    2    9
1    7    6    2    4
7    1    4    8    9

Então a saída deve ser:

45, 33, 16, 17

Porque: 2+9+1+7+10+10+2+4=45, 7+7+1+7+2+9=33, 6+4+2+4=16, 8+9=17.

Casos de teste:

Os casos de teste estão no seguinte formato:

Input
---
Output

5
---
5
..........

1  4
----
5
..........

7
2
---
9
..........

 8    3    7   10    3    7   10    1
10    7    5    8    4    3    3    1
 1    6    4    1    3    6   10    1
 2    3    8    2    8    3    4    1
---
62   40   33   18
..........

30    39    48     1    10    19    28
38    47     7     9    18    27    29
46     6     8    17    26    35    37
 5    14    16    25    34    36    45
13    15    24    33    42    44     4
21    23    32    41    43     3    12
22    31    40    49     2    11    20
---
320  226   235   263   135    26    20
..........

7   10    1
4    4    2
6    3    4
1    4   10
5    7    6
---
34   20   20

Como matrizes:

[[5]]
[[1,4]]
[[7],[2]]
[[8,3,7,10,3,7,10,1],[10,7,5,8,4,3,3,1],[1,6,4,1,3,6,10,1],[2,3,8,2,8,3,4,1]]
[[30,39,48,1,10,19,28],[38,47,7,9,18,27,29],[46,6,8,17,26,35,37],[5,14,16,25,34,36,45],[13,15,24,33,42,44,4],[21,23,32,41,43,3,12],[22,31,40,49,2,11,20]]
[[7,10,1],[4,4,2],[6,3,4],[1,4,10],[5,7,6]]

Isso é e a solução mais curta em cada idioma vence.

Stewie Griffin
fonte
2
@ JonathanAllan, imprimir zeros para sempre é um pouco exagerado, então acho que devo dizer não a esse.
Stewie Griffin
1
Programa Retina para converter de exemplos bonitos em matrizes Python.
Mbomb007
1
Olhando para os exemplos. a descrição da tarefa está incorreta. A segunda coluna no primeiro exemplo é 10,7,7,1, a segunda linha é 9,7,7,2,9e a soma é 59. E assim por diante
edc65
1
@ edc65 Observando os exemplos, parece que os números usados ​​nos cálculos anteriores não são reutilizados. Ou, de outra maneira, ao considerar a enésima linha, use apenas valores da enésima coluna em diante e ignore os das colunas 1 a n-1.
Brian J
1
@ Arc676 Regras io padrão. Os argumentos da função são um dos métodos de entrada aceitos.
Stewie Griffin

Respostas:

10

MATL , 16 bytes

&n:w:!XlX:GX:1XQ

Experimente online! Ou verifique todos os casos de teste .

Explicação

Considere, por exemplo, a entrada

2   10   10    2    4
9    7    7    2    9
1    7    6    2    4
7    1    4    8    9

O código &n:w:!Xlcria o vetor da coluna [1; 2; 3; 4]e o vetor da linha [1 2 3 4 5]. Em seguida, Xlcalcula o mínimo em elementos com broadcast, o que fornece à matriz

1 1 1 1 1
1 2 2 2 2
1 2 3 3 3
1 2 3 4 4

X:lineariza essa matriz (na ordem principal da coluna) no vetor da coluna [1; 1; 1; 1; 1; 2; 2; ... ; 4]. Esse vetor e a matriz de entrada linearizada, obtida como GX:, são passadas como entradas para a accumarray(... @sum)função, ou 1XQ. Isso calcula a soma da segunda entrada agrupada por valores da primeira entrada.

Luis Mendo
fonte
7

Gelatina , 3 bytes

ŒDS

Experimente online!

Como funciona

ŒDS

ŒD   diagonals
  S  vectorized sum
Freira Furada
fonte
5

CJam , 23 18 bytes

{[{(:+\z}h;]2/::+}

Bloco anônimo esperando o argumento na pilha e deixando o resultado na pilha.

Experimente online!

Explicação

[      e# Begin working in an array.
 {     e#  Do:
  (:+  e#   Remove the first row of the matrix and sum it.
  \z   e#   Bring the matrix back to the top and transpose it.
 }h    e#  While the matrix is non-empty.
 ;     e#  Discard the remaining empty matrix.
]      e# Close the array.
2/     e# Split it into consecutive pairs of elements (possibly with a singleton on the end).
::+    e# Sum each pair.
Gato de negócios
fonte
Isso não é um pouco "trapaceiro"? Quero dizer, você não está contando o código de entrada e saída na contagem de bytes. Com a entrada e a saída, é apenas 1 byte a mais:q~[{(:+\z}h;]2/::+p
FrodCube
@FrodCube É permitido por meta consenso .
Business Cat
2
Na verdade, tecnicamente, seria o mesmo tamanho de um programa completo, pois eu poderia omitir a abertura [. Mas, como um bloco, acho que preciso, porque ele também não captura a pilha inteira abaixo.
Business Cat
5

05AB1E , 14 11 bytes

[ćOˆøŽ]¯2ôO

Experimente online!

Explicação

[   Ž ]       # loop until stack is empty
 ć            # extract the head
  Oˆ          # sum and add to global list
     ø        # transpose
       ¯      # push global list
        2ô    # split into pairs
          O   # sum each pair
Emigna
fonte
4

JavaScript (ES6), 60 bytes

a=>a.map((b,y)=>b.map((c,x)=>r[x=x<y?x:y]=~~r[x]+c),r=[])&&r

Solução ingênua, pode ser uma maneira melhor.

ETHproductions
fonte
4

Mathematica, 60 bytes

Inspirado na resposta MATL de Luis Mendo .

Pick[#,Min~Array~d,n]~Total~2~Table~{n,Min[d=Dimensions@#]}&

Explicação: Min~Array~Dimensions@#constrói uma matriz como a seguinte:

1 1 1 1 1
1 2 2 2 2
1 2 3 3 3
1 2 3 4 4

Em seguida, Pick[#,...,n]~Total~2seleciona as entradas da matriz de entrada correspondentes ao número nna matriz estranha acima e as soma. Finalmente, ...~Table~{n,Min[d=Dimensions@#]}itera n.

Este é 1 byte menor que a abordagem ingênua:

{#[[n,n;;]],#[[n+1;;,n]]}~Total~2~Table~{n,Min@Dimensions@#}&
Não é uma árvore
fonte
4

Haskell, 50 49 bytes

f(a@(_:_):b)=sum(a++map(!!0)b):f(tail<$>b)
f _=[]

Experimente online!

Se houver pelo menos uma linha com pelo menos um elemento, o resultado será a soma da primeira linha e as cabeças de todas as outras linhas, seguidas por uma chamada recursiva com as caudas de todas as outras linhas. Em todos os outros casos, o resultado é a lista vazia.

Edit: Ørjan Johansen salvou um byte. Obrigado!

nimi
fonte
4

Oitava , 64 52 bytes

Obrigado a @StewieGriffin por economizar 1 byte!

@(x)accumarray(min((1:size(x))',1:rows(x'))(:),x(:))

Isso define uma função anônima.

Experimente online!

Explicação

O código é semelhante à minha resposta MATL (veja a explicação lá).

Dois bytes foram salvos usando em 1:size(x)vez de 1:size(x,1), explorando o fato de que 1:[a b]se comporta da mesma forma que 1:a. Além disso, um byte foi salvo usando em 1:rows(x')vez de 1:size(x,2), graças a Stewie.

Luis Mendo
fonte
3

k, 19 bytes

|1_-':|+//'(1_+1_)\

Experimente online!

Explicação:

           (1_+1_)   /a function that strips the top and leftmost rows of a matrix
                  \  /apply this function as many times as possible,
                     /    saving each result as one element of a list
       +//'          /for each result, get the sum of all numbers
|  -':|              /subtract every right value from every left value
 1_                  /remove the extra 0
zgrep
fonte
3

05AB1E , 16 bytes

[ćOsø.g<NQ#])2ôO

Experimente online! ou Experimente todos os testes

[                # Start loop
 ć               # Extract first element
  O              # Sum
   sø            # Transpose the input array (without the first N rows and columns)
     .g<NQ       # Push if (stack height - 1 == loop count)
          #]     # If they were equal break
            )2ô  # Break stack into chunks of 2
               O # Sum the chunks
Riley
fonte
3

Oitava , 63 60 bytes

@(A)(@(L)sum(triu(A,1)')(L)+sum(tril(A))(L))(1:min(size(A)))

Experimente online!

A resposta para esta matriz:

2   10   10    2    4
9    7    7    2    9
1    7    6    2    4
7    1    4    8    9

é o vetor de somas de linha de sua parte triangular superior:

0   10   10    2    4
0    0    7    2    9
0    0    0    2    4
0    0    0    0    9

mais o vetor das somas da coluna de sua parte triangular inferior:

2    0    0    0    0
9    7    0    0    0
1    7    6    0    0
7    1    4    8    0

que é exatamente o que minha resposta é computar.

eush77
fonte
2

Julia , 62 bytes

f=x->1∈size(x)?sum(x):(n=f(x[2:end,2:end]);[sum(x)-sum(n);n])

Funciona recursivamente somando toda a matriz e subtraindo a soma do próximo bloco. Provavelmente não é a abordagem mais eficaz, mas é bem intuitiva.

Julian Wolf
fonte
2

Java 7, 248 bytes

String c(int[][]a){int l=a.length,L=a[0].length,b[][]=new int[l][L],i,j,x=1,s;for(;x<(l>L?l:L);x++)for(i=l;i-->x;)for(j=L;j-->x;b[i][j]=x);String r="";for(;x-->0;r=s>0?s+" "+r:r)for(s=0,i=0;i<l;i++)for(j=0;j<L;j++)s+=b[i][j]==x?a[i][j]:0;return r;}

Experimente aqui.

Explicação geral:

Digamos que a matriz de entrada tenha dimensões de 4x6. A primeira parte do código criará uma matriz temporária e a preencherá da seguinte maneira:

// 1. Fill the entire array with 0:
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

// 2. Overwrite the inner part with 1 (excluding the first row & column):
0 0 0 0 0 0
0 1 1 1 1 1
0 1 1 1 1 1
0 1 1 1 1 1

// #. Etc. until we are left with this:
0 0 0 0 0 0
0 1 1 1 1 1
0 1 2 2 2 2
0 1 2 3 3 3

E na segunda parte do código, ele fará um loop sobre essa matriz temp e somará todos os valores da matriz de entrada para cada um dos números distintos na matriz temp.

Explicação do código:

String c(int[][]a){               // Method with int-matrix parameter and String return-type
  int l=a.length,                 //  Amount of rows
      L=a[0].length,              //  Amount of columns
      b[][]=new int[l][L],        //  New temp matrix to fill as explained above
      i,j,x=1,s;                  //  Some temp integers

                                  //This is the first part of the code mentioned above:
  for(;x<(l>L?l:L);x++)           //  Loop (1) over the rows or columns (whichever is highest)
    for(i=l;i-->x;)               //   Inner loop (2) over the rows
      for(j=L;j-->x;              //    Inner loop (3) over the columns
        b[i][j]=x);               //     Set the current `x`-number
                                  //    End of loop (3) (implicit / no body)
                                  //   End of loop (2) (implicit / single-line body)
                                  //  End of loop (1) (implicit / single-line body)

                                  //This is the second part of the code mentioned above:
  String r="";                    //  Result-String
  for(;x-->0;                     //  Loop (4) over the unique numbers in the temp matrix
             r=s>0?s+" "+r:r)     //   After every iteration, append the sum to the result (if it's larger than 0)
    for(s=0,i=0;i<l;i++)          //   Inner loop (5) over the rows (and reset the sum to 0)
      for(j=0;j<L;j++)            //    Inner loop (6) over the columns
        s+=b[i][j]==x?a[i][j]:0;  //     Add to the sum if its position equals the current `x` in the temp matrix
                                  //    End of loop (6) (implicit / single-line body)
                                  //   End of loop (5) (implicit / single-line body)
                                  //  End of loop (4) (implicit / single-line body)
  return r;                       //  Return the result-String
}                                 // End of method
Kevin Cruijssen
fonte
2

Perl 6 , 63 55 bytes

{($_ Z [Z] $_).kv.map(->\a,\b{b.flatmap(*[a..*]).sum -b[0;a]})}

{($_ Z [Z] .skip).kv.map({$^b.flatmap(*[$^a..*]).sum})}
  • $_ é a entrada da matriz para a função anônima
  • .skip é a matriz de entrada com sua primeira linha removida
  • [Z] .skipé a transposição da matriz de entrada com sua primeira linha removida; isto é, a transposição sem sua primeira coluna
  • $_ Z [Z] .skip fecha a matriz de entrada com sua transpose-sans-first-column, produzindo uma lista ((first-row, first-column-sans-first-element), (second-row, second-column-sans-first-element), ...)
  • .kv prefixa cada par com seu índice
  • map({...})mapeia os pares, usando uma função que recebe seu primeiro argumento (o índice) $^ae seu segundo (o par de linhas / colunas) em$^b
  • $^b.flatmap(*[$^a..*]).sumretira os primeiros $^aelementos de cada par de linhas / colunas e soma todos os elementos restantes

Depois de pensar um pouco, percebi que retirar a primeira coluna da transposição antes de fechar era equivalente a subtrair os elementos diagonais com dupla contribuição, como na minha primeira solução. Isso permite que eu exclua essa subtração e o uso de cada argumento para a função de mapeamento apenas uma vez tornou o {...$^a...$^b...}método de passar argumentos para uma função anônima mais eficiente que o original -> \a, \b {...a...b...}.

Sean
fonte
1

Vim, 66 , 52 bytes

qq^f j<C-v>}dkV}Jo<esc>p@qq@q:%s/\v> +</+/g|%norm C<C-v><C-r>=<C-v><C-r>"<C-v><cr><cr>

Experimente online!

A ferramenta errada para o trabalho ...

DJMcMayhem
fonte
1

Gelatina , 10 bytes

Ḣ;Ḣ€SṄȧßS¿

Um programa completo que imprime os valores

Experimente online!

Quão?

Ḣ;Ḣ€SṄȧßF¿ - Main link: list of lists a
Ḣ          - head a (pop the first row and yield it, modifying a)
  Ḣ€       - head €ach (do the same for each of the remaining rows)
 ;         - concatenate
    S      - sum (adds up the list that contains the top row and left column)
     Ṅ     - print that plus a linefeed and yield the result
         ¿ - while:
           - ... condition:
        F  -   flatten (a list of empty lists flattens to an empty list which is falsey) 
           - ... body:
       ß   -   call this link with the same arity (as a monad) i.e. Main(modified a)
      ȧ    - logical and (when the sum is non-zero gets the modified a to feed back in)
Jonathan Allan
fonte
1

Python + NumPy, 75 bytes

A entrada é uma matriz numpy 2D.

lambda L:[sum(L[i,i:])+sum(L[i+1:,i])for i in range(min(len(L),len(L[0])))]

Experimente online

mbomb007
fonte
1

Python 2 , 97 bytes

f=lambda m:[reduce(lambda x,y:x+y[i],m[i:],sum(m[i][i+1:]))for i in range(min(len(m),len(m[0])))]

Experimente online!

ZestyLemon
fonte
Há bastante espaço em branco nesta resposta que pode ser removido.
Assistente de trigo
@WheatWizard Thanks! Reduzi a minha resposta em 4 bytes :)
ZestyLemon 19/17
1

Pitão, 16 15 bytes

.es+>b+1k>@CQkk

Pega uma matriz no estilo python de matrizes de números, retorna uma matriz de somas.

Tente!

Explicação

.es+>b+1k>@CQkk 
.e             Q  # Enumerated map over the implicit input (Q); indices k, rows b
           CQ     # Take the transpose
          @  k    # The kth column
         >    k   # cut off the first k elements
    >b+1k         # cut off the first k+1 elements of the rows, so (k,k) isn't counted twice
  s+              # add the row and column together and sum
KarlKastor
fonte
1

GNU APL 1.7, 123 bytes

A solução requer duas funções: uma cria uma matriz global e as chamadas a segunda, que acrescenta recursivamente as somas a essa matriz.

∇f N
R←⍬
g N
R
∇
∇g N
→2+2×0∈⍴N
R←R,(+/N[1;])+(+/N[;1])-N[1;1]
g N[1↓⍳1⊃⍴N;1↓⍳2⊃⍴N]
∇

inicia e termina a função. Ambos fe grecebem tabelas como argumentos (essencialmente matrizes 2D). Estes podem ser criados com X←rows cols ⍴ 1 2 3 4....

R←⍬atribui um vetor vazio à variável global R.

g N chama a segunda função com o mesmo argumento dado à primeira.

⍴Ndá as dimensões de N; quando uma das dimensões é zero, não há mais linhas / colunas para adicionar. 0∈⍴Nretorna 1 se houver um zero nas dimensões. →2+2×0∈⍴Nramifica para a linha número 2 mais 2 vezes o valor de retorno da função: se não houver zero, retorna 0 e a função ramifica para a linha 2 (a próxima linha). Se não é um zero, retornos 1 e os ramos de função para a linha 4 (no final da função, de modo returnessencialmente).

/é o operador de redução. Aplica o argumento esquerdo, que é um operador ( +) a todos os elementos da lista, dados como argumento correto. N[1;]fornece a primeira linha inteira da tabela e N[;1]a primeira coluna. (+/N[1;])+(+/N[;1])-N[1;1]soma a primeira linha e coluna e subtrai o valor no canto superior esquerdo porque é adicionado na soma da coluna e na soma da linha. R←R,...anexa o valor recém-calculado ao vetor global R.

A função então se chama (recursiva até não haver mais linhas ou colunas). O operador pick obtém o elemento especificado da lista. 1⊃⍴Nfornece o número de linhas, 2⊃⍴No número de colunas. fornece todos os números de 1 ao número especificado. O operador drop remove elementos do início da lista. Se você fornecer vários índices ao acessar elementos de uma tabela ou vetor (por exemplo N[1 2 3]), o APL acessará cada um. Portanto, 1↓⍳1⊃⍴Nfornece os índices de cada linha excluindo o primeiro ( 2, 3, 4, ..., N) e 1↓⍳2⊃⍴Nfornece um vetor semelhante, exceto para as colunas. g N[1↓⍳1⊃⍴N;1↓⍳2⊃⍴N]chama a função novamente, mas sem a primeira linha ou coluna.

Arc676
fonte
0

PHP, 76 bytes

<?foreach($_GET as$k=>$v)foreach($v as$n=>$i)$r[min($k,$n)]+=$i;print_r($r);

Experimente online!

Jörg Hülsermann
fonte
0

Mathematica, 116 bytes

l=Length;If[l@#==1||l@#[[1]]==1,Total@Flatten@#,Total/@Flatten/@Table[{#[[i]][[i;;]],#[[All,i]][[i+1;;]]},{i,l@#}]]&

Formulário de entrada

[{{5}}], [{{1}, {4}}], [{{7,2}}] ou [{{....}, {....} ... {. ...}}]

J42161217
fonte
0

Clojure, 98 bytes

#(vals(apply merge-with +(sorted-map)(mapcat(fn[i r](map(fn[j v]{(min i j)v})(range)r))(range)%)))

Repete a entrada com índices de linha e coluna (de maneira muito detalhada), cria um mapa de hash com o mínimo de ie, jcomo chave, mescla mapas de hash com +um mapa de classificação, retorna valores.

NikoNyrh
fonte
0

R, 102 bytes

function(x)`for`(i,1:min(r<-nrow(x),k<-ncol(x)),{dput(sum(x[,1],x[1,-1]));x=matrix(x[-1,-1],r-i,k-i)})

retorna uma função anônima; imprime os resultados no console, com uma nova linha à direita. Eu provavelmente preciso de uma abordagem diferente.

Repete o mínimo das linhas e colunas; imprime a soma de x[,1](a primeira coluna) e x[1,-1]a primeira linha, exceto a primeira entrada, depois define xcomo uma matriz igual a x[-1,-1](ou seja, xexcluindo sua primeira linha e coluna). Infelizmente, a simples configuração x=x[-1,-1]faz com que ela falhe no caso de uma matriz quadrada, porque quando xé 2x2, o subconjunto retorna um vetor em vez de uma matriz.

Experimente online!

Giuseppe
fonte
0

Java 7, 280 276 bytes

import java.util.*;String d(ArrayList l){String r="";for(;l.size()>0&&((List)l.get(0)).size()>0;l.remove(0))r+=s(l)+" ";return r;}int s(List<ArrayList<Integer>>l){int s=0,L=l.size(),i=1;for(;l.get(0).size()>0;s+=l.get(0).remove(0));for(;i<L;s+=l.get(i++).remove(0));return s;}

Experimente aqui.

Abordagem alternativa em comparação com a minha resposta anterior com matrizes, que ainda é mais curta do que essa no final (então eu meio que perdi tempo tentando essa abordagem alternativa).

Explicação geral:

Inspiração da @Riley resposta 05AB1E incrível 's
Esta resposta utiliza uma lista e depois de cada soma é calculada ele remove a primeira coluna e primeira linha da Lista de matriz, como este:

// Starting matrix:
7 10 1
4 4  2
6 3  4
1 4  10
5 7  6

// After first iteration (result so far: "34 "):
4  2
3  4
4  10
7  6

// After second iteration (result so far: "34 20 "):
4
10
6

// After last iteration, result: "34 20 20 "

Explicação do código:

import java.util.*;                // Required import for List and ArrayList

String d(ArrayList l){             //  Method with ArrayList parameter and String return-type
  String r="";                     //  Return-String
  for(;l.size()>0&&((List)l.get(0)).size()>0; 
                                   //  Loop as long as the list still contains anything
       l.remove(0))                //  And remove the first row after every iteration
    r+=s(l)+" ";                   //   Append the sum to the result-String
                                   //  End of loop (implicit / single-line body)
  return r;                        //  Return result-String
}                                  // End of method

int s(List<ArrayList<Integer>>l){  // Separate method with List-matrix parameter and integer return-type
  int s=0,                         //  The sum
      L=l.size(),                  //  The size of the input list
      i=1;                         //  Temp integer
  for(;l.get(0).size()>0;          //  Loop (1) over the items of the first row
    s+=l.get(0).                   //   Add the number to the sum
                remove(0)          //   And remove it from the list afterwards
  );                               //  End of loop (1)
  for(;i<L;                        //  Loop (2) over the rows
    s+=l.get(i++).                 //   Add the first number of the row to the sum
                  remove(0)        //   And remove it from the list afterwards
  );                               //  End of loop (2)
  return s;                        //  Return sum
}                                  // End of separate method
Kevin Cruijssen
fonte
0

Python, 93 bytes

Semelhante à resposta do mbomb007, mas sem o NumPy

f=lambda m:[sum(m[k][k:])+sum(list(zip(*m))[k][k+1:])for k in range(min(len(m),len(m[0])))]
PattuX
fonte