Você recebe uma matriz multidimensional de números inteiros. Cada dimensão tem um tamanho fixo (para que seja sempre retangular se for 2D). Seu programa deve calcular as somas em cada dimensão e anexá-las como os novos últimos itens nessa dimensão.
Suponha que as matrizes de entrada e saída sejam A e B, e o tamanho da dimensão i de A seja n i . B teria o mesmo número de dimensões como A e o tamanho da dimensão i seria n i 1. B j 1 , j 2 , ..., j m é a soma de A k 1 , k 2 , ..., k m onde:
- k i = j i se j i <= n i
- 0 <k i <= n i se j i = n i +1
Para a entrada:
[[1 2 3]
[4 5 6]]
Seu programa (ou função) deve gerar:
[[1 2 3 6]
[4 5 6 15]
[5 7 9 21]]
A entrada contém apenas a matriz. O número total de dimensões e o tamanho de cada dimensão não são fornecidos na entrada. (Mas você pode obtê-los da matriz usando seu próprio código.) Você pode usar qualquer formato de lista conveniente no seu idioma, desde que não especifique diretamente o número de dimensões ou tamanhos de dimensão.
A entrada possui pelo menos 1 dimensão e pelo menos 1 item na matriz.
Isso é código-golfe. O menor código vence.
Casos de teste
Input:
[5 2 3]
Output:
[5 2 3 10]
Input:
[[1 2 3] [4 5 6]]
Outputs:
[[1 2 3 6] [4 5 6 15] [5 7 9 21]]
Input:
[[[1] [1] [1] [0]]]
Output:
[[[1 1] [1 1] [1 1] [0 0] [3 3]] [[1 1] [1 1] [1 1] [0 0] [3 3]]]
Input:
[[[[-1]]]]
Output:
[[[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]] [[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]]]
fonte
Respostas:
J, 14 bytes
Uso:
A função é equivalente ao seguinte,
(0|:],+/)^:(#@$)
mas usa um advérbio definido pelo usuário para salvar parênteses.Explicação para o último código da direita para a esquerda:
^:(#@$)
repita^:
para o número#
de dimensões$
:],+/
concatenar,
ao argumento]
com a soma dele na última dimensão+/
0|:
gire as dimensões|:
colocando a primeira0
no final da lista de dimensõesDepois de executar o procedimento acima, retornamos a entrada original com somas em todas as dimensões.
Para minha solução mais antiga, verifique o histórico de revisões.
Experimente online aqui.
fonte
Mathematica,
3220 bytesExemplo:
Explicação:
A forma completa de
{{1, 2, 3}, {4, 5, 6}}
éList[List[1, 2, 3], List[4, 5, 6]]
. Em seguida, substitua todas asList
s na expressão com a função({##,+##}&)
.fonte
Python 2, 95 bytes
Isso itera sobre cada dimensão, concatenando suas somas usando NumPy.
Tropecei no NumPy's
r_
, o que é incrível para o golfe.r_[:n]
é mais curtorange(n)
e muito mais poderoso (por exemplor_[:4, 7, 8, 10:100:10]
). Também pode fazer outras coisas, como concatenação ao longo de um eixo arbitrário.Exemplo de uso:
fonte
APL,
1615 bytesObrigado a @ user23013 por obter 3 bytes de golfe e descobrir o formato de entrada adequado.
Verifique os casos de teste online com o TryAPL .
Idéia
A idéia geral é a mesma da minha submissão ao CJam, para a qual o APL permite uma implementação muito mais curta. Consiste em apenas duas etapas:
Soma a matriz em sua dimensão mais extrema.
Repita a etapa 1 para cada sub-matriz.
Código
fonte
,⊂(,1)(,1)(,1)(,0)
e,⊂,⊂,⊂,¯1
respectivamente. Então você pode remover outro personagem.Pip ,
1815 bytesEssa é uma função anônima, que pega a matriz como argumento e retorna o resultado. Chamada de amostra, usando o
-p
sinalizador para obter saída legível:A idéia é basicamente a mesma do APL de Dennis , embora derivada de forma independente. Mais especificamente:
Esse método funciona porque
+
(junto com muitos outros operadores) funciona item-a-item nas listas do Pip - um recurso inspirado em linguagens de programação de array como APL. Então, quando você$+
gosta de uma lista[[1 2 3] [4 5 6]]
, o resultado é[5 7 9]
o desejado. Também usado no teste de lista ou escalar:[1 2 3] - [1 2 3]
give[0 0 0]
, que é verdadeiro (como todas as listas, exceto a lista vazia).Versão anterior de 18 bytes:
Alterar:
[1 2 3] != 123
);M
têm precedência mais baixa do que?
(embora eu provavelmente mude isso, especialmente agora): sem eles, o código seria analisado como(Ja=a?af)M(aAE$+a)
, levando a mensagens de erro bizarras. No entanto, o argumento do meio de um operador ternário pode ser qualquer expressão de qualquer precedência, sem necessidade de parênteses. Portanto, tornando a lista o caso mais verdadeiro, posso salvar esses dois bytes.fonte
APL (25)
As matrizes da APL possuem dimensões internas, portanto, essa é uma função que pega uma matriz n- dimensional e depois soma ao longo de cada dimensão.
Explicação:
N←⍵
: armazena a matriz emN
.⍴⍴N
: obtenha a quantidade de dimensões queN
possui. (⍴
fornece as dimensões, ou seja,⍴↑(1 2 3)(4 5 6)
fornece2 3
,⍴⍴
fornece as dimensões das dimensões.){
...}¨⍳
: para cada número de 1 a⍴⍴N
:+/[⍵]N
: somaN
ao longo da dimensão⍵
N,[⍵]←
: junte o resultadoN
nessa dimensãoN
: finalmente, volteN
.fonte
↑(1 2 3)(4 5 6)
está fazendo é simplesmente construir uma matriz bidimensional a partir de duas matrizes unidimensionais usando↑
. Não é uma notação incorporada e não generaliza a maneira como você pensa. A maneira canônica de construir as 3ª e 4ª matrizes seria1 4 1⍴1 1 1 0
e1 1 1 1⍴¯1
, mas também é possível construí-las sem se referir aos tamanhos, por exemplo, a terceira matriz também pode ser construída com↑⍉⍪(,1)(,1)(,1)(,0)
a quarta, com a quarta↑⍪⊂⍪¯1
.f←{0=≡⍵:⍵⋄f¨⍵,+/⍵}⋄f((1 2)(3 4))((5 6)(7 8))
), mas parece que os vetores e matrizes aninhadas são diferentes e os primeiros não faz escalares diferenciar de singletons ...{×≡⍵:∇¨⍵,+/⍵⋄⍵}((1 2)(3 4))((5 6)(7 8))
. Fixo:{×⍴⍴⍵:∇↓⍵,+/⍵⋄⍵}1 4 1⍴1 1 1 0
. Agora é mais curto que o Mathematica ...CJam, 36 bytes
Essa é uma função nomeada recursiva que exibe uma matriz da pilha e deixa uma em retorno.
Experimente os casos de teste no intérprete CJam .
Idéia
Infelizmente, o CJam não possui um operador auto-mágico que permita adicionar matrizes aninhadas arbitrariamente; portanto, temos que implementá-lo nós mesmos. Felizmente, isso faz com que dois operadores de infixo,
:
(reduzam) e.
(vectorizem), serão úteis para esta tarefa.O primeiro passo é calcular o número de dimensões. Isso é fácil: converta a matriz em sua representação de string e conte o número de [ 's iniciais.
Agora, para reduzir uma matriz de uma dimensão, você normalmente apenas executa
:+
:Para uma matriz de duas dimensões,
+
seria realizada concatenação em vez de adição, portanto, temos que vetorizá-la:Agora, para uma matriz de três dimensões,
.+
operaria em matrizes de duas dimensões e executaria, mais uma vez, concatenação. Desta vez, temos que vetorizar.+
:Para o caso geral, uma matriz de dimensão D , temos que encadear uma
:
, D - 1.
e uma+
.Obviamente, isso apenas soma o array apenas em sua dimensão mais extrema. Podemos resolver isso definindo uma função S que calcula a dimensão (e não faz nada se for zero), executa a soma conforme indicado acima e, finalmente, aplica-se aos elementos da matriz.
Código
fonte
Ruby (
181139119108 bytes)Assume que a entrada é passada como JSON.
fonte
d
desta resposta.Java, 669 bytes
não vou mentir, tenho muito orgulho de mim por esse: p
expandido com testes:
executar a versão de teste expandida imprime isto:
fonte