Inspiriert von Kopiert von dieser Frage bei Stack Overflow.
A
Erstellen Sie bei einer gegebenen Matrix eine Matrix B
, bei der die Spalten von A
blockdiagonal angeordnet sind. Zum Beispiel gegeben
1 2 3
4 5 6
die Ausgabe wäre
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
Regeln
Eingabe und Ausgabe können in Form von 2D-Arrays, verschachtelten Arrays oder Zeichenfolgen mit unterschiedlichen Trennzeichen für Zeilen und Spalten erfolgen.
Zahlen in der Eingabe (Matrix A
) sind positive ganze Zahlen.
Unäres Format ist zulässig, solange Nullen in der Ausgabe in angemessener Weise angezeigt werden. Zum Beispiel könnte das obige Ergebnis mit Anführungszeichen angezeigt werden, um jede Zahl einzuschließen:
'1' '' ''
'1111' '' ''
'' '11' ''
'' '11111' ''
'' '' '111'
'' '' '111111'
Testfälle
Input-Output:
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
quelle
quelle
Antworten:
MATL , 6 Bytes
Funktioniert in der aktuellen Version (13.0.0) der Sprache / des Compilers.
Die Eingabe hat die folgende Form, mit Semikolon als Zeilentrennzeichen und Kommas oder Leerzeichen als Spaltentrennzeichen in jeder Zeile:
Probieren Sie es online!
Erläuterung
Gearbeitetes Beispiel
Betrachten Sie die Eingabe
[1 2 3; 4 5 6]
. Die for-Schleife, die mit beginnt,"
übernimmt jede Spalte der Eingabe.@
Verschiebt die aktuelle Spalte innerhalb jeder Iteration auf den Stapel. Also drückt es in der ersten Iteration[1; 4]
.N$
Gibt an, dass der gesamte Stapelinhalt als Eingabe für die folgende Funktion verwendet wird.Yd
.Diese Funktion (die MATLABs entspricht
blkdiag
) "verknüpft" ihre Eingaben diagonal, um eine Blockdiagonalmatrix (2D-Array) zu erzeugen. Also in der ersten IterationYd
nimmt es eine Eingabe und erzeugt eine Ausgabe gleich dieser Eingabe,[1; 4]
, die auf dem Stapel verbleibt.In der zweiten Iteration wird die zweite Spalte der Eingabe
[2; 5]
gedrückt. JetztYd
zwei 2 × 1-Eingänge, nämlich[1; 4]
und[2; 5]
, und erzeugt das 4 × 2-Array[1 0; 4 0; 0 2; 0 5]
.Bei der dritten Iteration werden
Yd
das letztere 4 × 2-Array und die dritte Spalte der Eingabe verwendet[3; 6]
und das Endergebnis erzeugt[1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6]
.quelle
ES6, 65 Bytes
Nimmt als Eingabe und gibt als Ausgabe ein Array von Arrays zurück.
quelle
Mathematica,
4039 BytesGutschrift an @Seeq für
Infix
ingFlatten
.Die Eingabe ist eine Liste von Zeilenvektoren, die durch begrenzt sind
{}
Klammern . Das erste Beispiel ist also dargestellt durchGenerieren Sie ein Array
DiagonalMatrix
mit diagonalen Elementen aus den Zeilen der Eingabe (3-D-Array).Transpose
DieFlatten
Operation entfernt also die richtigen Klammernpaare, um die gewünschte Matrix (jetzt 2D-Array) zu erhalten.quelle
DiagonalMatrix/@#
funktionieren Und im weiterenTranspose[DiagonalMatrix/@#]~Flatten~1&
Infix
Flatten
. +1.Pyth, 17
Probieren Sie es online aus oder starten Sie das Test Suite aus .
Sie können ein Lead hinzufügen
j
, um das 2D-Array besser zu visualisieren.quelle
Jelly, 13 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Mathematica, 111 Bytes
quelle
Table
undPart
Fehler bei der Standard - MMA Matrixnotation und die Ergebnisse in einer Reihe von Misch Dimensionen verwenden.Ruby,
81787662 BytesSeufzer Manuelles Verfolgen des Index ist kürzer als
with_index
.quelle
R, 41 Bytes
Angenommen
pryr
,Matrix
undplyr
Pakete sind installiert.Dadurch wird eine Funktion erstellt, die ein 2D-Array (a) annimmt und eine "sparseMatrix" zurückgibt, wobei (wobei die Nullen als dargestellt werden
.
).Erläuterung:
plyr::alply(a,2)
Jede Spalte vona
und gibt diese Ergebnisse in einer Liste wiederMatrix::.bdiag(lst)
Erstellt eine Blockdiagonalmatrix aus einer Liste von Matrizenpryr::f
ist eine Kurzform zum Erstellen einer Funktion.Eine vollständig
R
basierende Lösung in 59 Bytes (unter Verwendung der Logik der Matlab-Antwort von @ PieCot):quelle
MATLAB,
6968 BytesEin Byte wurde abgeschabt: dank Luis Mendo :)
quelle
APL (Dyalog Classic) , 11 Bytes
Probieren Sie es online!
quelle