Sebagai bagian dari algoritma kompresinya, standar JPEG membuka gulungan sebuah matriks ke dalam vektor di sepanjang antidiagonals dari arah yang bergantian:
Tugas Anda adalah mengambil matriks (belum tentu kuadrat) dan mengembalikannya dalam bentuk yang tidak terbuka. Sebagai contoh:
[1 2 3 4
5 6 7 8
9 1 2 3]
harus menghasilkan
[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3]
Aturan
Anda dapat mengasumsikan bahwa elemen matriks 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).
Matriks input dapat diberikan 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.)
Vektor output mungkin dalam format string atau daftar yang mudah, tidak ambigu, datar.
Aturan standar kode-golf berlaku.
Uji Kasus
[[1]] => [1]
[[1 2] [3 1]] => [1 2 3 1]
[[1 2 3 1]] => [1 2 3 1]
[[1 2 3] [5 6 4] [9 7 8] [1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 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]
[[1 2 6 3 1 2] [5 9 4 7 8 3]] => [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 2 5 9 6 3 4 7 1 2 8 3]
[[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
Tantangan Terkait
- Rekonstruksi matriks zig-zagifikasi (transformasi terbalik yang agak rumit)
- Putar anti-diagonal
sumber
Jawaban:
J,
3130141211 byteYch . Terlalu besar.Mengambil matriks sebagai input.
Penjelasan
J memiliki keunggulan di sini. Ada perintah yang disebut oblique (
/.
) yang mengambil garis miring pada gilirannya dan menerapkan kata kerja kepada mereka. Dalam hal ini saya menggunakan gerund untuk menerapkan dua kata kerja secara bergantian:<
( kotak ) dan<@|.
( terbalik dan kotak). Maka itu hanya masalah unboxing menggunakan segalanya;
( meruntuhkan ).sumber
Pyth,
24232120191817 byteVersi 17 byte alternatif:
ssuL_G=!T.T+LaYkQ
Terima kasih kepada @FryAmTheEggman untuk satu byte, @Jakube untuk 2 byte, dan @isaacg untuk satu byte!
Penjelasan "ilmu hitam" disinggung di atas:
m_W=!Td
pada dasarnya membalikkan setiap subarray lainnya. Ini dilakukan dengan memetakan_W=!T
setiap subarray;W
adalah aplikasi bersyarat, jadi itu_
(membalikkan) semua subarrays mana=!T
yang benar.T
adalah variabel yang diinisialisasi ke sepuluh (kebenaran), dan=!T
berarti(T = !T)
. Jadi itu mengubah nilai variabel yang dimulai dengan kebenaran dan mengembalikan nilai baru, yang berarti bahwa itu akan bergantian antara mengembalikan kepalsuan, kebenaran, kepalsuan, kebenaran ... (kredit ke Jakube untuk ide ini)Test suite di sini .
sumber
Jelly,
2419151311 byteMengambil jumlah baris, jumlah kolom dan daftar datar sebagai argumen baris perintah yang terpisah.
Cobalah online!
Bagaimana itu bekerja
sumber
⍁
dan⍂
? Atau mungkin Skandinaviaø
danǿ
?MATL ,
2827 byteDiadaptasi dari jawaban saya di sini . Gagasan umum adalah membuat array 2D dengan ukuran yang sama dengan input, diisi dengan nilai yang meningkat dalam urutan yang sama dengan jalur zig-zag. Kemudian versi linierisasi (diratakan) dari array itu diurutkan, dan indeksnya dari pengurutan itu disimpan. Itu adalah indeks yang perlu diterapkan pada input untuk menghasilkan jalur zig-zag.
Input ada dalam formulir
Penjelasan
Cobalah online!
sumber
Matlab, 134 byte
Saya baru saja mencoba yang terbaik untuk mempersingkat kode saya di Matlab, seperti telegraphing.
Catatan:
M
adalah sebuahm×n
matriks.a
danb
keduanya matriks ukuran yang samaM
, masing-masing barisa
terdiri dari angka yang sama dengan nomor barisnya, sedangkan setiap kolomb
sama dengan nomor kolomnya. Dengan demikian,a
+b
adalah matriks yang elemennya sama dengan jumlah baris dan jumlah kolomnya, yaitumatrix(p,q)=p+q
,.A(p,q)=p+q-1
,; danB(p,q)=p-q
.C
secara matematis dinyatakan sebagai persamaan di bawah ini. dengan persamaan, matriks zigzagifiedly meningkat dapat dibuat seperti yang ditunjukkan di bawah ini.C
menunjukkan urutan elemen M dalam hasil zig-zag. Kemudian,[~,I]=sort(C(:));
mengembalikan urutan, yaituI
, dengan demikian,V=V(I)'
adalah hasilnya.sumber
JavaScript (SpiderMonkey 30+), 99 byte
Diuji dalam Firefox 44. Mengambil input sebagai array 2D.
sumber
Python 2, 84 byte
Porting jawaban nimi . Mengambil array datar dengan lebar dan tinggi yang diberikan. xsot menyimpan byte.
88 byte:
Mengambil array datar dengan lebar dan tinggi yang diberikan. Urutkan koordinat 2D yang sesuai
(i/w,i%w)
dalam urutan zigzag untuk meningkatkan jumlah untuk mendapatkan diagonal, yang ditambahkan dengan menambah atau mengurangi nilai baris, berdasarkan apakah kolom plus baris itu ganjil atau genap.sumber
Haskell,
797873 byteInput adalah daftar datar dengan jumlah baris dan kolom, misalnya
( [1,2,6,3,1,2,5,9,4,7,8,3] # 2) 6
->[1,2,5,9,6,3,4,7,1,2,8,3]
.Cara kerjanya: berjalan melalui koordinat x dan y dari matriks (
h
baris,w
kolom) dalam dua loop bersarang:yaitu dari atas / kanan ke bawah / kiri, melompati indeks terikat (
y
danx
harus memenuhiy<h
danx-y<w
). Kapanx
genap, urutan loop dalam terbalik:y
beralih darix
ke0
. Saya melakukan ini dengan memilih fungsi modifikasi untuk y-range[0..x]
yang merupakanx
elemen ke-10[reverse,id,reverse,id,...]
.Sunting: @xnatau atur ulang loop dan simpan 5 byte. Terima kasih!
sumber
g=id:reverse:g
.(y-x)*w
dapat dipotong oleh transposing masalah:(m#h)w=[m!!(x*w+y-x)|y<-[0..h+w],x<-g!!y$[0..y],x<h,y-x<w] g=reverse:id:g
. Menerjemahkan ke dalam Python menghemat 3 karakter atas apa yang saya miliki.Python 2 + NumPy, 122 byte
Aku mengakuinya. Saya bekerja di depan. Sayangnya, metode yang sama ini tidak dapat dengan mudah dimodifikasi untuk menyelesaikan 2 tantangan terkait lainnya ...
Mengambil array numpy sebagai input. Menghasilkan daftar.
Cobalah online
Penjelasan:
Sebuah lambda memiliki panjang yang sama:
sumber
Python 3,
131118115107 byteBerdasarkan principe yang sama seperti saya jawaban dari tantangan Deusovi ini
Saya berasumsi kita tidak dapat memiliki nol di matrik input
Penjelasan
bagaimana itu bekerja :
Hasil
sumber
reverse even line
menjadireverse odd lines
sebaliknya?