Rekonstruksi matriks zig-zag

18

Sebagai bagian dari algoritma kompresinya, standar JPEG membuka gulungan sebuah matriks ke dalam vektor di sepanjang antidiagonals dari arah yang bergantian:

masukkan deskripsi gambar di sini

Tugas Anda adalah mengambil vektor yang tidak terbuka bersama dengan dimensi matriks dan merekonstruksi matriks yang sesuai. Sebagai contoh:

[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3], 4, 3

harus menghasilkan

[1 2 3 4
 5 6 7 8
 9 1 2 3]

sedangkan dimensi 6, 2akan memberi

[1 2 6 3 1 2
 5 9 4 7 8 3]

Aturan

Anda dapat memilih untuk hanya mengambil satu dimensi sebagai input. Input individual dapat diambil dalam urutan apa pun. Anda dapat mengasumsikan bahwa lebar dan tinggi positif dan valid untuk panjang vektor yang diberikan.

Anda dapat mengasumsikan bahwa elemen vektor adalah bilangan bulat positif kurang dari 10.

Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).

Vektor input dapat diberikan dalam format string atau daftar datar yang nyaman, tidak ambigu, datar.

Matriks keluaran mungkin dalam format string atau string yang nyaman, tidak ambigu, bersarang, atau sebagai daftar datar bersama dengan kedua dimensi matriks. (Atau, tentu saja, sebagai jenis matriks jika bahasa Anda memilikinya.)

Aturan standar berlaku.

Uji Kasus

Setiap test case berbentuk formulir vector width height => matrix.

[1] 1 1                        => [[1]]
[1 2 3 1] 2 2                  => [[1 2] [3 1]]
[1 2 3 1] 4 1                  => [[1 2 3 1]]
[1 2 5 9 6 3 4 7 1 2 8 3] 3 4  => [[1 2 3] [5 6 4] [9 7 8] [1 2 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 4 3  => [[1 2 3 4] [5 6 7 8] [9 1 2 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 6 2  => [[1 2 6 3 1 2] [5 9 4 7 8 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 12 1 => [[1 2 5 9 6 3 4 7 1 2 8 3]]
[1 2 5 9 6 3 4 7 1 2 8 3] 1 12 => [[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]]

Tantangan Terkait

Martin Ender
sumber

Jawaban:

7

Jelly, 18 13 byte

pS€żị"¥pỤỤị⁵s

Mengambil jumlah baris, jumlah kolom dan daftar datar sebagai argumen baris perintah yang terpisah.

Kode saya hampir identik dengan kode yang ada di tantangan kembar . Satu-satunya perbedaan adalah tambahan (yang membalik permutasi indeks) dan s(untuk membagi output menjadi array 2D).

Cobalah online!

Dennis
sumber
4

MATL , 29 byte

:!i:+-1y^8MtsQ/*-X:4#S2$S1GZC

Input height, width, vectordipisahkan dengan baris baru.

Ini menggunakan kembali sebagian kode dalam jawaban saya untuk tantangan terkait .

Cobalah online!

Penjelasan

:!      % take number of rows, r, as input. Generate column vector [1;2;...;r]
i:      % take number of columns, c, as input. Generate row vector [1,2,...,c] 
+       % add with broadcast. Gives 2D array
-1      % push -1
y^      % duplicate previous 2D array. Compute -1 raised to that
8M      % push [1;2;...;r] again
tsQ/    % divide by its sum plus 1
*       % multiply
-       % subtract
X:      % linearize 2D array into column array
4#S     % sort and push the indices of the sorting. Gives a column vector
2$S     % take vector as input. Sort it according to previous column vector
1G      % push r
ZC      % reshape into columns of r elements
Luis Mendo
sumber
0

J, 24 byte

]$({~[:/:@;[:<@|.`</.i.)

Juga menggunakan kata keterangan miring /.untuk melakukan zig-zagify seperti pada jawaban J dari tantangan itu .

Pemakaian

Input dengan array pada LHS dan dimensi [height, width]pada RHS.

   f =: ]$({~[:/:@;[:<@|.`</.i.)
   1 f 1 1
1
   1 2 3 1 f 2 2
1 2
3 1
   1 2 5 9 6 3 4 7 1 2 8 3 f 4 3
1 2 3
5 6 4
9 7 8
1 2 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 3 4
1 2 3 4
5 6 7 8
9 1 2 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 2 6
1 2 6 3 1 2
5 9 4 7 8 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 1 12
1 2 5 9 6 3 4 7 1 2 8 3
   1 2 5 9 6 3 4 7 1 2 8 3 f 12 1
1
2
5
9
6
3
4
7
1
2
8
3

Penjelasan

]$({~[:/:@;[:<@|.`</.i.)  Input: list A (LHS), dimensions D (RHS)
                     i.   Range shaped to D
           [:<@|.`</.     Zigzagify that matrix
     [:   ;               Raze the boxes to get a zigzagify permutation
       /:@                Invert that permutation to get an unzigzagify permutation
   {~                     Apply that permutation to A
]                         Get D
 $                        Shape that permutation to D and return
mil
sumber