Kompres matriks jarang menggunakan baris jarang Terkompresi (format CSR, CRS, atau Yale) .
Ini semua adalah bentuk kompresi yang sama (abaikan Yale baru).
Input mungkin berupa struktur data 2d (daftar daftar, dll): mis
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Dan outputnya harus tiga struktur data 1d (daftar dll), yang menunjukkan output A
, IA
dan JA
, misalnya
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
Prosesnya dijelaskan oleh wikipedia:
Array A memiliki panjang NNZ dan menampung semua entri bukan-nol dari M dalam urutan kiri-ke-kanan atas-ke-bawah ("baris-utama").
Array IA memiliki panjang m + 1. Ini didefinisikan oleh definisi rekursif ini:
IA [0] = 0 IA [i] = IA [i - 1] + + (jumlah elemen bukan nol pada baris ke-1 (i - 1) dalam matriks asli)
Dengan demikian, elemen m pertama dari IA menyimpan indeks menjadi A dari elemen bukan nol pertama di setiap baris M, dan elemen terakhir IA [m] menyimpan NNZ, jumlah elemen dalam A, yang dapat juga dianggap sebagai indeks dalam A dari elemen pertama dari baris phantom tepat di luar ujung matriks M. Nilai-nilai dari baris ke-i dari matriks asli dibaca dari elemen A [IA [i]] ke A [IA [i + 1] - 1] (inklusif pada kedua ujungnya), yaitu dari awal satu baris ke indeks terakhir tepat sebelum awal berikutnya. [5]
Array ketiga, JA, berisi indeks kolom dalam M dari setiap elemen A dan karenanya panjang NNZ juga.
Jika bahasa Anda tidak mendukung struktur data aktual, input dan output mungkin berupa teks.
Uji kasus
Input 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Output 1:
[ 5, 8, 3, 6 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Input 2
[[10 20 0 0 0 0],
[0 30 0 40 0 0],
[0 0 50 60 70 0],
[0 0 0 0 0 80]]
Output 2:
[ 10 20 30 40 50 60 70 80 ]
[ 0 2 4 7 8 ]
[ 0 1 1 3 2 3 4 5 ]
Input 3:
[[0 0 0],
[0 0 0],
[0 0 0]]
Output 3:
[ ]
[ 0 0 0 0 ]
[ ]
Input 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Keluaran 4:
[ 1 1 1 1 1 1 1 1 1 ]
[ 0 3 6 9 ]
[ 0 1 2 0 1 2 0 1 2 ]
Input 5:
[[0 0 0 0],
[5 -9 0 0],
[0 0 0.3 0],
[0 -400 0 0]]
Output 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Asumsikan input dapat berisi bilangan real, Anda tidak perlu mempertimbangkan simbol matematika atau representasi eksponensial (mis. 5.000 tidak akan pernah dimasukkan sebagai 5e3). Anda tidak perlu untuk menangani inf
, -inf
, NaN
atau lainnya 'pseudo-nomor'. Anda dapat menampilkan representasi nomor yang berbeda (5.000 dapat berupa output sebagai 5e3 jika Anda memilihnya).
Mencetak:
Ini adalah kode-golf , byte terkecil yang menang.
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
# Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
IA[0] = 0
sama sekali tidak perlu? Ini hanya perlu didefinisikan IA[i] = IA[i − 1]...
, namun kita dapat dengan mudah menyatakan bahwa jika i-1 < 0
menggunakan 0. Artinya, IA [0] selalu sama dengan 0, karenanya dapat dikompresi (ya, saya menyadari bahwa ini adalah kritik terhadap algoritma, bukan tantangan ini).