Terinspirasi oleh Disalin dari pertanyaan ini di Stack Overflow.
Diberi matriks A
, buat matriks B
sedemikian rupa sehingga kolom-kolomnya A
disusun secara blok-diagonal. Misalnya diberikan
1 2 3
4 5 6
hasilnya akan
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
Aturan
Input dan output mungkin dalam bentuk array 2D, array bersarang, atau string dengan pemisah yang berbeda untuk baris dan kolom.
Angka dalam input (matriks A
) akan menjadi bilangan bulat positif.
Format unary diperbolehkan, selama nol di output ditampilkan dengan cara yang masuk akal. Misalnya, hasil di atas dapat ditampilkan menggunakan tanda kutip untuk melampirkan masing-masing nomor:
'1' '' ''
'1111' '' ''
'' '11' ''
'' '11111' ''
'' '' '111'
'' '' '111111'
Uji kasus
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
sumber
sumber
Jawaban:
MATL , 6 byte
Bekerja dalam versi bahasa saat ini (13.0.0) / kompiler.
Input memiliki bentuk berikut, dengan titik koma sebagai pemisah baris, dan koma atau spasi sebagai pemisah kolom dalam setiap baris:
Cobalah online!
Penjelasan
Contoh yang berhasil
Pertimbangkan inputnya
[1 2 3; 4 5 6]
. Untuk loop dimulai dengan"
mengambil setiap kolom input. Dalam setiap iterasi,@
dorong kolom saat ini ke tumpukan. Jadi dalam iterasi pertama ia mendorong[1; 4]
.N$
menetapkan bahwa semua konten tumpukan akan digunakan sebagai input dari fungsi berikutYd
,.Fungsi ini (sesuai dengan MATLAB
blkdiag
) "menyatukan secara diagonal" inputnya untuk menghasilkan matriks diagonal blok (array 2D). Jadi dalam iterasi pertamaYd
dibutuhkan satu input dan menghasilkan output yang sama dengan input itu[1; 4]
,, yang tersisa di stack.Pada iterasi kedua kolom kedua dari input,,
[2; 5]
didorong. SekarangYd
mengambil dua input 2 × 1, yaitu[1; 4]
dan[2; 5]
, dan menghasilkan array 4 × 2[1 0; 4 0; 0 2; 0 5]
.Pada iterasi ketiga
Yd
mengambil 4 × 2 array terakhir dan kolom ketiga dari input[3; 6]
,, dan menghasilkan hasil akhir[1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6]
.sumber
ES6, 65 byte
Dibawa sebagai input dan kembali sebagai output array array.
sumber
Mathematica,
4039 BytesKredit ke @Seeq untuk
Infix
ingFlatten
.Input adalah daftar vektor baris yang dibatasi oleh
{}
tanda kurung. Jadi contoh awal diwakili olehHasilkan sebuah array di
DiagonalMatrix
mana masing-masing memiliki elemen diagonal dari baris input (array 3-D).Transpose
sehinggaFlatten
operasi menghilangkan pasangan braket yang benar untuk memberikan matriks yang diinginkan (sekarang array 2-D).sumber
DiagonalMatrix/@#
bekerja Dan, dengan ekstensi,Transpose[DiagonalMatrix/@#]~Flatten~1&
Infix
Flatten
. +1.Pyth, 17
Cobalah secara online atau jalankan Test Suite .
Anda dapat menambahkan arahan
j
untuk membantu memvisualisasikan array 2D.sumber
Jelly, 13 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Mathematica, 111 byte
sumber
Table
danPart
kesalahan ketika menggunakan notasi matriks MMA standar dan menghasilkan array dimensi campuran.Ruby,
81787662 bytemendesah secara manual melacak indeks lebih pendek dari
with_index
.sumber
R, 41 byte
Asumsikan
pryr
,Matrix
danplyr
paket diinstal.Ini menciptakan fungsi yang mengambil array 2D (a) dan mengembalikan "sparseMatrix" di mana (di mana 0 diwakili sebagai
.
)Penjelasan:
plyr::alply(a,2)
setiap koloma
dan pengembalian menggabungkan hasil ini dalam daftarMatrix::.bdiag(lst)
membuat blok diagonal matriks dari daftar matrikspryr::f
adalah cara singkat untuk membuat suatu fungsi.Solusi sepenuhnya berbasis
R
di 59 byte (menggunakan logika jawaban Matlab @ PieCot):sumber
MATLAB,
6968 byteSatu byte dicukur habis: terima kasih kepada Luis Mendo :)
sumber
APL (Dyalog Classic) , 11 byte
Cobalah online!
sumber