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
var QUESTION_ID=129924,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
IA[0] = 0
sama sekali tidak perlu? Ini hanya perlu didefinisikanIA[i] = IA[i − 1]...
, namun kita dapat dengan mudah menyatakan bahwa jikai-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).Jawaban:
MATL , 19 byte
Input digunakan
;
sebagai pemisah baris.Cobalah online! Atau verifikasi semua kasus uji: 1 , 2 , 3 , 4 , 5 .
Penjelasan
sumber
Mathematica, 78 byte
Lihat jawaban ini di mathematica.stackexchange.com .
sumber
Haskell, 87 byte
Cobalah online!
Bagaimana itu bekerja:
sumber
Jelly , 24 byte
Cobalah online!
sumber
APL (Dyalog) ,
3128 karakter atau3633 byte *Membutuhkan
⎕IO←0
pengindeksan berbasis nol. I / O adalah daftar daftar.Cobalah online!
{
...}
fungsi anonim di mana argumen diwakili oleh ⍵(
...)(
...)(
...)
kembalikan daftar tiga hal:⍵≠0
Boolean di mana argumen berbeda dari 0⍸¨
d dari daftar tersebut untuk setiap sub-daftar∊
ϵ nlist (rata) untuk digabungkan menjadi satu daftar⍵~¨0
menghilangkan angka nol dari masing-masing sub-daftar argumend←
toko yang sebagai d≢¨
penghitungan masing-masing+\
jumlah kumulatif0,
tambahkan nol∊d
ϵ daftar (ratakan) d untuk digabung menjadi satu daftar* Untuk berjalan di Dyalog Classic, cukup ganti
⍸
dengan⎕U2378
.sumber
f 4 4⍴
dan kemudian nilainya?f
. Masukan ini benar-benar sebuah REPL, yang menyerukanf
hasil4 4⍴…
yang r eshapes data menjadi 4 × 4 matriks.PHP , 107 byte
Cobalah online!
PHP , 109 byte
Cobalah online!
sumber
$x[]=$v
dengan$x[]=+$v
JavaScript (ES6), 117 byte
Input adalah array angka 2D dan output array
[A, IA, JA]
.Dijelaskan
Tes
Tampilkan cuplikan kode
sumber
Python 2 , 115 byte
Cobalah online!
Output adalah
[A, JA, IA]
sumber
Perl 6 , 84 byte
Cobalah online!
Argumen matriks tunggal dalam
$_
..flatmap(*.grep(+*))
memilih elemen bukan nol dari seluruh matriks.[\+] .map(+*.grep(+*))
adalah pengurangan segitiga dari jumlah elemen di setiap baris (yang disebut beberapa bahasascan
).(0,|...)
menambahkan nol ke daftar itu..flat.kv
menghasilkan daftar semua elemen matriks yang diindeks..flatmap: { $^a % .[0] xx ?$^b }
peta datar di atas modulus setiap indeks dengan jumlah kolom dalam array (.[0]
, jumlah elemen di baris pertama), direplikasi oleh elemen itu sendiri, ditafsirkan sebagai boolean. Yaitu, elemen bukan nol direplikasi sekali, dan elemen nol direplikasi nol kali (yaitu, dihapus).sumber
Python + SciPy, 79 byte
Saya kira built-in tidak dilarang
Menerima input dalam format
[[0, 0, 0, 0],[5, 8, 0, 0],[0, 0, 3, 0],[0, 6, 0, 0]]
sumber
Japt ,
3127 byteMengambil input sebagai array array dan mengembalikan array array.
Mengujinya (
-Q
menandai untuk tujuan visualisasi saja)Penjelasan
Input array secara implisit
U
.[[1,1,1],[1,1,1],[1,1,1]]
Untuk sub pertama = -array, kami meratakan (
c
)U
dan kemudian menyaring (f
), menghapus elemen falsey (yaitu, 0s)[1,1,1,1,1,1,1,1,1]
Kita akan membangun 2 sub-array lainnya secara bersamaan, dengan memetakan
U
.Kami memetakan setiap elemen (sub-array) di
U
X
adalah elemen saat ini dari sub-array saat ini dan©
logis AND (&&
) jadi, jikaX
tidak benar (bukan nol) bagian selanjutnya tidak akan dieksekusi.Di Japt,
N
adalah array yang berisi semua input jadi di sini, jikaX
benar, kami mendorong (p
) indeks (Y
) dari elemen saat ini keN
.[[[1,1,1],[1,1,1],[1,1,1]],0,1,2,0,1,2,0,1,2]
Kembali ke peta array utama dan, untuk setiap elemen (
Z
), kami mendapatkan jumlah elemen dalam sub-array yang benar (bukan nol).[3,3,3]
Secara kumulatif kurangi larik ini dengan menjumlahkan.
[3,6,9]
Sisipkan (
i
) 0 pada indeks 0 untuk menyelesaikan sub-larik kedua.[0,3,6,9]
Untuk sub-array terakhir, kita cukup mengiris
N
dari elemen 1.[0,1,2,0,1,2,0,1,2]
sumber