Inspirado en Copiado de esta pregunta en Stack Overflow.
Dada una matriz A
, cree una matriz de B
modo que las columnas de A
esté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 ,. AhoraYd
toma 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
Yd
toma 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
Infix
ingFlatten
.La entrada es una lista de vectores de fila delimitados por
{}
paréntesis. Entonces el ejemplo inicial está representado porGenere una matriz de
DiagonalMatrix
donde cada uno tiene elementos diagonales de las filas de la entrada (matriz 3D).Transpose
Por lo tanto, laFlatten
operació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&
Infix
Flatten
Aunque no pensé en usar el . +1.Pyth, 17
Pruébelo en línea o ejecute Test Suite .
Puede agregar una guía
j
para ayudar a visualizar la matriz 2D.fuente
Jalea, 13 bytes
Pruébalo en línea!
Cómo funciona
fuente
Mathematica, 111 bytes
fuente
Table
yPart
errores 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
,Matrix
y losplyr
paquetes 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 dea
y retornos combina estos resultados en una listaMatrix::.bdiag(lst)
crea una matriz diagonal de bloque a partir de una lista de matricespryr::f
es una forma abreviada de crear una función.Una
R
solució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