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 é código-golfe, e a solução mais curta em cada idioma vence.
10,7,7,1
, a segunda linha é9,7,7,2,9
e a soma é59
. E assim por dianteRespostas:
MATL , 16 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
Considere, por exemplo, a entrada
O código
&n:w:!Xl
cria o vetor da coluna[1; 2; 3; 4]
e o vetor da linha[1 2 3 4 5]
. Em seguida,Xl
calcula o mínimo em elementos com broadcast, o que fornece à matrizX:
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 comoGX:
, são passadas como entradas para aaccumarray(... @sum)
função, ou1XQ
. Isso calcula a soma da segunda entrada agrupada por valores da primeira entrada.fonte
Gelatina , 3 bytes
Experimente online!
Como funciona
fonte
CJam ,
2318 bytesBloco anônimo esperando o argumento na pilha e deixando o resultado na pilha.
Experimente online!
Explicação
fonte
q~[{(:+\z}h;]2/::+p
[
. Mas, como um bloco, acho que preciso, porque ele também não captura a pilha inteira abaixo.05AB1E ,
1411 bytesExperimente online!
Explicação
fonte
JavaScript (ES6), 60 bytes
Solução ingênua, pode ser uma maneira melhor.
fonte
Mathematica, 60 bytes
Inspirado na resposta MATL de Luis Mendo .
Explicação:
Min~Array~Dimensions@#
constrói uma matriz como a seguinte:Em seguida,
Pick[#,...,n]~Total~2
seleciona as entradas da matriz de entrada correspondentes ao númeron
na matriz estranha acima e as soma. Finalmente,...~Table~{n,Min[d=Dimensions@#]}
iteran
.Este é 1 byte menor que a abordagem ingênua:
fonte
Haskell,
5049 bytesExperimente 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!
fonte
Oitava ,
6452 bytesObrigado a @StewieGriffin por economizar 1 byte!
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 de1:size(x,1)
, explorando o fato de que1:[a b]
se comporta da mesma forma que1:a
. Além disso, um byte foi salvo usando em1:rows(x')
vez de1:size(x,2)
, graças a Stewie.fonte
k, 19 bytes
Experimente online!
Explicação:
fonte
05AB1E , 16 bytes
Experimente online! ou Experimente todos os testes
fonte
Oitava ,
6360 bytesExperimente online!
A resposta para esta matriz:
é o vetor de somas de linha de sua parte triangular superior:
mais o vetor das somas da coluna de sua parte triangular inferior:
que é exatamente o que minha resposta é computar.
fonte
Julia , 62 bytes
Funciona recursivamente somando toda a matriz e subtraindo a soma do próximo bloco. Provavelmente não é a abordagem mais eficaz, mas é bem intuitiva.
fonte
Java 7, 248 bytes
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:
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:
fonte
Perl 6 ,
6355 bytes{($_ Z [Z] $_).kv.map(->\a,\b{b.flatmap(*[a..*]).sum -b[0;a]})}
$_
é 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 índicemap({...})
mapeia os pares, usando uma função que recebe seu primeiro argumento (o índice)$^a
e seu segundo (o par de linhas / colunas) em$^b
$^b.flatmap(*[$^a..*]).sum
retira os primeiros$^a
elementos de cada par de linhas / colunas e soma todos os elementos restantesDepois 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...}
.fonte
Vim,
66, 52 bytesExperimente online!
A ferramenta errada para o trabalho ...
fonte
Gelatina , 10 bytes
Um programa completo que imprime os valores
Experimente online!
Quão?
fonte
Python + NumPy, 75 bytes
A entrada é uma matriz numpy 2D.
Experimente online
fonte
Python 2 , 97 bytes
Experimente online!
fonte
Pitão,
1615 bytesPega uma matriz no estilo python de matrizes de números, retorna uma matriz de somas.
Tente!
Explicação
fonte
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.
∇
inicia e termina a função. Ambosf
eg
recebem tabelas como argumentos (essencialmente matrizes 2D). Estes podem ser criados comX←rows cols ⍴ 1 2 3 4...
.R←⍬
atribui um vetor vazio à variável globalR
.g N
chama a segunda função com o mesmo argumento dado à primeira.⍴N
dá as dimensões deN
; quando uma das dimensões é zero, não há mais linhas / colunas para adicionar.0∈⍴N
retorna 1 se houver um zero nas dimensões.→2+2×0∈⍴N
ramifica 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 modoreturn
essencialmente)./
é 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 eN[;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 globalR
.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⊃⍴N
fornece o número de linhas,2⊃⍴N
o 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 exemploN[1 2 3]
), o APL acessará cada um. Portanto,1↓⍳1⊃⍴N
fornece os índices de cada linha excluindo o primeiro (2, 3, 4, ..., N
) e1↓⍳2⊃⍴N
fornece 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.fonte
PHP, 76 bytes
Experimente online!
fonte
Mathematica, 116 bytes
Formulário de entrada
fonte
Clojure, 98 bytes
Repete a entrada com índices de linha e coluna (de maneira muito detalhada), cria um mapa de hash com o mínimo de
i
e,j
como chave, mescla mapas de hash com+
um mapa de classificação, retorna valores.fonte
R, 102 bytes
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) ex[1,-1]
a primeira linha, exceto a primeira entrada, depois definex
como uma matriz igual ax[-1,-1]
(ou seja,x
excluindo sua primeira linha e coluna). Infelizmente, a simples configuraçãox=x[-1,-1]
faz com que ela falhe no caso de uma matriz quadrada, porque quandox
é 2x2, o subconjunto retorna um vetor em vez de uma matriz.Experimente online!
fonte
Java 7,
280276 bytesExperimente 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:
Explicação do código:
fonte
Python, 93 bytes
Semelhante à resposta do mbomb007, mas sem o NumPy
fonte