Inspirado por Copiado desta pergunta no Stack Overflow.
Dada uma matriz A
, crie uma matriz de B
modo que as colunas de A
sejam dispostas na diagonal do bloco. Por exemplo, dado
1 2 3
4 5 6
a saída seria
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
Regras
A entrada e a saída podem estar na forma de matrizes 2D, matrizes aninhadas ou seqüências de caracteres com diferentes separadores para linhas e colunas.
Os números na entrada (matriz A
) serão números inteiros positivos.
O formato unário é permitido, desde que os zeros na saída sejam exibidos de uma maneira razoável. Por exemplo, o resultado acima pode ser exibido usando aspas para incluir cada número:
'1' '' ''
'1111' '' ''
'' '11' ''
'' '11111' ''
'' '' '111'
'' '' '111111'
Casos de teste
Entrada, saída:
1 2 3
4 5 6
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
10 20
10 0
0 20
10
20
10
20
1 2 3
10 20 30
100 200 300
1 0 0
10 0 0
100 0 0
0 2 0
0 20 0
0 200 0
0 0 3
0 0 30
0 0 300
2 4
6 8
10 12
2 0
6 0
10 0
0 4
0 8
0 12
code-golf
number
array-manipulation
Luis Mendo
fonte
fonte
Respostas:
MATL , 6 bytes
Funciona na versão atual (13.0.0) do idioma / compilador.
A entrada possui o seguinte formato, com ponto-e-vírgula como separador de linhas e vírgulas ou espaços como separadores de colunas em cada linha:
Experimente online!
Explicação
Exemplo trabalhado
Considere a entrada
[1 2 3; 4 5 6]
. O loop for começando com"
leva cada coluna da entrada. Dentro de cada iteração,@
empurra a coluna atual para a pilha. Então, na primeira iteração, ele empurra[1; 4]
.N$
especifica que todo o conteúdo da pilha será usado como entrada da seguinte funçãoYd
,.Esta função (correspondente ao MATLAB
blkdiag
) "concatena diagonalmente" suas entradas para produzir uma matriz diagonal de bloco (matriz 2D). Portanto, na primeira iteração,Yd
é necessária uma entrada e produz uma saída igual a essa entrada[1; 4]
, que é deixada na pilha.Na segunda iteração, a segunda coluna da entrada
[2; 5]
,, é pressionada. AgoraYd
tem duas entradas de 2 × 1, nomeadamente[1; 4]
e[2; 5]
, e produz a matriz 4 × 2[1 0; 4 0; 0 2; 0 5]
.Na terceira iteração,
Yd
pega a última matriz 4 × 2 e a terceira coluna da entrada[3; 6]
e produz o resultado final[1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6]
.fonte
ES6, 65 bytes
Toma como entrada e retorna como saída uma matriz de matrizes.
fonte
Mathematica,
4039 BytesCrédito para @Seeq por
Infix
ingFlatten
.Entrada é uma lista de vetores de linha delimitados por
{}
colchetes. Portanto, o exemplo inicial é representado porGere uma matriz de
DiagonalMatrix
onde cada uma possui elementos diagonais das linhas da entrada (matriz 3-D).Transpose
portanto, aFlatten
operação remove os pares de colchetes corretos para fornecer a matriz desejada (agora matriz 2-D).fonte
DiagonalMatrix/@#
funcionaria? E, por extensão,Transpose[DiagonalMatrix/@#]~Flatten~1&
Infix
Flatten
. +1.Pyth, 17
Experimente online ou execute o Test Suite .
Você pode adicionar um líder
j
para ajudar a visualizar a matriz 2D.fonte
Gelatina, 13 bytes
Experimente online!
Como funciona
fonte
Mathematica, 111 bytes
fonte
Table
ePart
erros quando usando a notação de matriz de MMA padrão e os resultados em uma matriz de dimensões mistas.Ruby,
81787662 bytessuspiro Manter o controle manual do índice é menor que
with_index
.fonte
R, 41 bytes
Assume
pryr
,Matrix
eplyr
pacotes são instalados.Isso cria uma função que pega uma matriz 2D (a) e retorna uma "sparseMatrix" onde (onde 0's são representados como
.
)Explicação:
plyr::alply(a,2)
cada coluna dea
e retorna combina esses resultados em uma listaMatrix::.bdiag(lst)
cria uma matriz diagonal de bloco a partir de uma lista de matrizespryr::f
é uma maneira abreviada de criar uma função.Uma
R
solução totalmente básica em 59 bytes (usando a lógica da resposta do Matlab do @ PieCot):fonte
MATLAB,
6968 bytesUm byte foi eliminado: graças a Luis Mendo :)
fonte
APL (Dyalog Classic) , 11 bytes
Experimente online!
fonte