Inspiré de Copied from this question at Stack Overflow.
Étant donné une matrice A
, créez une matrice B
telle que les colonnes de A
soient disposées en diagonale de bloc. Par exemple, étant donné
1 2 3
4 5 6
la sortie serait
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
Règles
L'entrée et la sortie peuvent prendre la forme de tableaux 2D, de tableaux imbriqués ou de chaînes avec des séparateurs différents pour les lignes et les colonnes.
Les nombres dans l'entrée (matrice A
) seront des entiers positifs.
Le format unaire est autorisé, tant que les zéros dans la sortie sont affichés d'une manière raisonnable. Par exemple, le résultat ci-dessus peut être affiché à l'aide de guillemets pour entourer chaque numéro:
'1' '' ''
'1111' '' ''
'' '11' ''
'' '11111' ''
'' '' '111'
'' '' '111111'
Cas de test
Entrée sortie:
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
la source
la source
Réponses:
MATL , 6 octets
Fonctionne dans la version actuelle (13.0.0) du langage / compilateur.
L'entrée a la forme suivante, avec un point-virgule comme séparateur de ligne et des virgules ou des espaces comme séparateurs de colonne dans chaque ligne:
Essayez-le en ligne!
Explication
Exemple travaillé
Considérez l'entrée
[1 2 3; 4 5 6]
. La boucle for commençant par"
prend chaque colonne de l'entrée. Dans chaque itération,@
pousse la colonne actuelle sur la pile. Donc dans la première itération ça pousse[1; 4]
.N$
précise que tout le contenu de la pile seront utilisés comme entrées de la fonction suivante,Yd
.Cette fonction (correspondant à MATLAB
blkdiag
) "concatène diagonalement" ses entrées pour produire une matrice diagonale de bloc (tableau 2D). Donc, dans la première itération,Yd
il prend une entrée et produit une sortie égale à cette entrée[1; 4]
, qui est laissée sur la pile.Dans la deuxième itération, la deuxième colonne de l'entrée
[2; 5]
,, est poussée. Prend maintenantYd
deux entrées 2 × 1, à savoir[1; 4]
et[2; 5]
, et produit le tableau 4 × 2[1 0; 4 0; 0 2; 0 5]
.Dans la troisième itération
Yd
prend le dernier tableau 4 × 2 et la troisième colonne de l'entrée[3; 6]
, et produit le résultat final[1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6]
.la source
ES6, 65 octets
Prend en entrée et renvoie en sortie un tableau de tableaux.
la source
Mathematica,
4039 octetsCrédit à @Seeq pour
Infix
ingFlatten
.L'entrée est une liste de vecteurs de ligne délimités par des
{}
crochets. Ainsi, l'exemple initial est représenté parGénérez un tableau
DiagonalMatrix
où chacun a des éléments diagonaux à partir des lignes de l'entrée (tableau 3-D).Transpose
de sorte que l'Flatten
opération supprime les paires de parenthèses correctes pour donner la matrice souhaitée (désormais tableau 2D).la source
DiagonalMatrix/@#
marcherait pas ? Et, par extension,Transpose[DiagonalMatrix/@#]~Flatten~1&
Infix
Flatten
bien. +1.Pyth, 17
Essayez-le en ligne ou exécutez la suite de tests .
Vous pouvez ajouter un interligne
j
pour aider à visualiser le tableau 2D.la source
Gelée, 13 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Mathematica, 111 octets
la source
Table
et desPart
erreurs lors de l' utilisation de la notation matrice standard MMA et les résultats dans un tableau de dimensions mixtes.Rubis,
81787662 octetssoupir Le suivi manuel de l'indice est plus court que
with_index
.la source
R, 41 octets
Suppose
pryr
,Matrix
et lesplyr
paquets sont installés.Cela crée une fonction qui prend un tableau 2D (a) et renvoie un "sparseMatrix" où (où les 0 sont représentés comme
.
)Explication:
plyr::alply(a,2)
chaque colonnea
et retours combine ces résultats dans une listeMatrix::.bdiag(lst)
crée une matrice diagonale de bloc à partir d'une liste de matricespryr::f
est un raccourci pour créer une fonction.Une
R
solution de base complète en 59 octets (utilisant la logique de la réponse Matlab de @ PieCot):la source
MATLAB,
6968 octetsUn octet a été rasé: grâce à Luis Mendo :)
la source
APL (Dyalog Classic) , 11 octets
Essayez-le en ligne!
la source