Pegue uma matriz de números inteiros positivos como entrada e faça a saída das somas individuais dos elementos nas linhas diagonais através da matriz.
Você só deve contar as linhas que vão na diagonal para baixo e para a direita. Você deve começar com a diagonal que contém apenas o elemento inferior esquerdo e, em seguida, a diagonal de comprimento dois acima (se existir), e assim por diante até a diagonal que contém apenas o elemento superior direito, conforme ilustrado abaixo.
Exemplo:
Input:
8 14 5 1
10 5 5 8
6 6 8 10
15 15 4 11
Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})
Input:
1
Output:
1
Input:
1 5
Output:
1, 5
Input:
4
1
Output:
1, 4
Input:
17 4 5
24 16 5
9 24 10
1 14 22
1 21 24
4 4 17
24 25 17
Output:
24, 29, 22, 39, 47, 70, 43, 9, 5
Os formatos de entrada e saída são opcionais, como sempre.
Isso é código-golfe , então a submissão mais curta em cada idioma vence.
Respostas:
Haskell ,
4037 bytesExperimente online! Uso:
(foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]]
.Edit: Obrigado a Ørjan Johansen por -3 bytes!
Ungolfed:
z
é uma lista de infinitos zeros. Emf
que dobre a lista de listasm
através da combinação de duas listas com a função#
. Na#
primeira listas
contém as somas acumuladas da coluna até o momento e a segunda listat
é a nova linha que deve ser adicionada. Mudamoss
um elemento para a direita, adicionando zero à frente e adicionandos
et
com elementoszipWith(+)
. Comos
pode ser arbitrariamente grande, precisamost
acrescentar zeros suficientes anexandoz
.fonte
foldl1$(.(++z)).zipWith(+).(0:)
.Mathematica,
5354 bytesFunção pura, tendo um array 2D como entrada e retornando uma lista. (As entradas não precisam ser números inteiros ou pares.)
Diagonal[#,k]
Retorna ak
th diagonal acima (ou abaixo, sek
for negativo) da diagonal principal.{k,-l@#,l@#&@@#}
calcula o intervalo de diagonais necessárias com base nas dimensões da matriz de entrada. ETr
soma as entradas de cada diagonal.fonte
Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
MATL , 6 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
s==sum(x(:))
, em vez de seguir a convenção do MATLAB, como o MATL parece fazer?sum(x)
esum(x,1)
. Para uma matrizx
, o fato desum(x)
se comportar de maneira diferente se a matriz tiver 1 linha é às vezes irritante. Mas no final decidi ir com o Matlab, para que os dois idiomas fiquem mais próximos; e adicione algumasfun(x,1)
funções para os casos mais comunsGelatina , 5 bytes
Experimente online!
Como funciona
fonte
ŒD
?ŒD
os pedidos estranhos impediram que fosse útil.JavaScript (ES6),
6558 bytesfonte
a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
CJam ,
2221 bytesGuardado 1 byte graças a Martin Ender
Bloco anônimo esperando o argumento na pilha e deixa o resultado na pilha.
Experimente online!
Como funciona
fonte
05AB1E , 17 bytes
Experimente online!
Explicação
fonte
J , 7 bytes
Experimente online!
Isso é bem simples:
Linhas invertidas oblíquas são as diagonais da matriz, portanto, isso é apenas a soma das diagonais.
fonte
Python 2 , 62 bytes
Experimente online!
fonte
Gelatina , 8 bytes
Experimente online!
Metade do código é usado para colocar os resultados na ordem correta.
Quão?
fonte
Perl 5, 47 bytes
fonte
R, 45 bytes
Função sem nome, recebendo um objeto de classe matricial como entrada:
Usando a ideia explicada nesta resposta.
fonte
unname
, mas essa é uma solução incrível, independentemente!Oitava, 71 bytes
Supondo que A seja uma matriz, por exemplo:
Então nós temos:
Observe que a transposição da matriz reverte a ordem das somas diagonais, o que salvou um total de dois bytes no loop for.
Resultado:
fonte
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),end
economiza 6 bytes. O Octave pode fazer indexação direta e atribuições em linha. Infelizmente, assumindo que a exist variável no espaço de trabalho antes de executar o código não é permitido, então eu acho que você deve usarinput
, como este trazendo de volta até 75 bytes. Boa abordagem, no entanto, +1 de mim :) E bem-vindo ao PPCG! =)zeros(m-1,m)
pode ser escrito~e(m-1,m)
, economizando 4 bytes :) Legal né?Python, 126 bytes
f
só funciona na seção triangular inferior, então eu a transponho e obtenho a seção triangular superior dessa maneira. Não sei por que af
função não funciona com valores negativos (mudeif
para ser mais curto porque a parte para obter os negativos não funcionou).fonte
C, 148 bytes
Experimente on-line
fonte
PHP, 81 bytes
Aceitar entrada como matriz 2 D
Experimente online!
fonte
Awk, 67 bytes
Ungolfed:
As divisões do awk no espaço em branco
$n
são on
th th (indexado a 1);NF
é o número de campos na linha,NR
é o número da linha atual. Variáveis indefinidas são 0 e criadas no primeiro uso.fonte
PHP, 86 bytes
uma solução amiga da memória em duas variantes:
recebe entrada de parâmetros de script, usa sublinhado como delimitador;
use as configurações padrão (não o php.ini padrão) ou tente online
fonte
Clojure, 81 bytes
Bastante detalhado, pois reúne listas com zeros para que possamos calcular a soma em colunas.
fonte
mathematica 73 bytes
Este funciona para QUALQUER mxn de matriz 2D (não apenas nxn)
insira a matriz no final do código como este (o último caso de teste)
entrada no formato [{a, b, c, d ...}, {m, n}]
fonte