Inspirado en Copiado de esta pregunta en Stack Overflow.
Dada una matriz A, cree una matriz de Bmodo que las columnas de Aestén dispuestas en forma de bloque diagonal. Por ejemplo, dado
1 2 3
4 5 6
la salida sería
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
Reglas
La entrada y la salida pueden estar en forma de matrices 2D, matrices anidadas o cadenas con diferentes separadores para filas y columnas.
Los números en la entrada (matriz A) serán enteros positivos.
Se permite el formato unario, siempre que los ceros en la salida se muestren de alguna manera razonable. Por ejemplo, el resultado anterior podría mostrarse entre comillas para encerrar cada número:
'1' '' ''
'1111' '' ''
'' '11' ''
'' '11111' ''
'' '' '111'
'' '' '111111'
Casos de prueba
De entrada y salida:
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
fuente
                
                fuente

Respuestas:
MATL , 6 bytes
Funciona en la versión actual (13.0.0) del lenguaje / compilador.
La entrada tiene la siguiente forma, con punto y coma como separador de fila, y comas o espacios como separadores de columna dentro de cada fila:
Pruébalo en línea!
Explicación
Ejemplo trabajado
Considere la entrada
[1 2 3; 4 5 6]. El ciclo for que comienza con"toma cada columna de la entrada. Dentro de cada iteración,@empuja la columna actual a la pila. Entonces en la primera iteración empuja[1; 4].N$especifica que todos los contenidos de la pila se utilizarán como entradas de la siguiente funciónYd,.Esta función (correspondiente a MATLAB
blkdiag) "concatena diagonalmente" sus entradas para producir una matriz diagonal de bloque (matriz 2D). Entonces, en la primera iteraciónYd, toma una entrada y produce una salida igual a esa entrada[1; 4], que se deja en la pila.En la segunda iteración
[2; 5], se empuja la segunda columna de la entrada ,. AhoraYdtoma dos 2 × 1 entradas, a saber,[1; 4]y[2; 5], y produce la matriz 4 × 2[1 0; 4 0; 0 2; 0 5].En la tercera iteración
Ydtoma la última matriz 4 × 2 y la tercera columna de la entrada[3; 6], y produce el resultado final[1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6].fuente
ES6, 65 bytes
Toma como entrada y devuelve como salida una matriz de matrices.
fuente
Mathematica,
4039 BytesCrédito a @Seeq por
InfixingFlatten.La entrada es una lista de vectores de fila delimitados por
{}paréntesis. Entonces el ejemplo inicial está representado porGenere una matriz de
DiagonalMatrixdonde cada uno tiene elementos diagonales de las filas de la entrada (matriz 3D).TransposePor lo tanto, laFlattenoperación elimina los pares de paréntesis correctos para obtener la matriz deseada (ahora matriz 2D).fuente
DiagonalMatrix/@#funcionaria? Y, por extensión,Transpose[DiagonalMatrix/@#]~Flatten~1&InfixFlattenAunque no pensé en usar el . +1.Pyth, 17
Pruébelo en línea o ejecute Test Suite .
Puede agregar una guía
jpara ayudar a visualizar la matriz 2D.fuente
Jalea, 13 bytes
Pruébalo en línea!
Cómo funciona
fuente
Mathematica, 111 bytes
fuente
TableyParterrores al usar notación y matriz de resultados MMA estándar en una variedad de dimensiones mixtas.Ruby,
81787662 bytessuspiro Hacer un seguimiento manual del índice es más corto que
with_index.fuente
R, 41 bytes
Asume
pryr,Matrixy losplyrpaquetes están instalados.Esto crea una función que toma una matriz 2D (a) y devuelve una "matriz dispersa" donde (donde los 0 se representan como
.)Explicación:
plyr::alply(a,2)cada columna deay retornos combina estos resultados en una listaMatrix::.bdiag(lst)crea una matriz diagonal de bloque a partir de una lista de matricespryr::fes una forma abreviada de crear una función.Una
Rsolución completamente base en 59 bytes (usando la lógica de la respuesta de Matlab de @ PieCot):fuente
MATLAB,
6968 bytesSe eliminó un byte: gracias a Luis Mendo :)
fuente
APL (Dyalog Classic) , 11 bytes
Pruébalo en línea!
fuente