Diberikan matriks bilangan bulat, uji apakah itu peringkat-satu, artinya setiap baris adalah kelipatan dari vektor yang sama. Misalnya, dalam
2 0 -20 10
-3 0 30 -15
0 0 0 0
setiap baris adalah kelipatan 1 0 -10 5
.
Definisi yang sama juga berfungsi dengan kolom menggantikan baris. Atau, sebuah matriks adalah peringkat-satu jika itu seperti tabel perkalian:
* 1 0 -10 5
----------------
2 | 2 0 -20 10
-3 | -3 0 30 -15
0 | 0 0 0 0
Kami telah menetapkan label baris r[i]
dan label kolom c[j]
sehingga setiap entri matriks M[i][j]
adalah produk dari label terkait M[i][j] = r[i] * c[j]
.
Memasukkan:
Matriks integer sebagai wadah 2D pilihan Anda. Misalnya, daftar daftar, array 2D, atau yang serupa. Anda tidak boleh mengambil lebar atau tinggi sebagai input tambahan kecuali format array mengharuskannya.
Matriksnya mungkin non-kuadrat. Ini akan memiliki setidaknya satu entri bukan nol - Anda tidak harus berurusan dengan matriks kosong atau nol.
Anda dapat mengasumsikan bilangan bulat tidak akan menyebabkan masalah melimpah.
Keluaran:
Nilai yang konsisten untuk matriks peringkat-satu, dan nilai konsisten yang berbeda untuk matriks lainnya.
Built-in:
Anda tidak boleh menggunakan bawaan apa pun untuk menghitung peringkat atau langsung memeriksa peringkat satu. Anda dapat menggunakan built-in lainnya seperti nilai eigen, dekomposisi, dll, tetapi saya mendorong jawaban upvot yang tidak memiliki built-in melakukan sebagian besar pekerjaan.
Kasus uji:
Peringkat satu:
[[2, 0, -20, 10], [-3, 0, 30, -15], [0, 0, 0, 0]]
[[0, 0, 0], [0, 3, 0], [0, 0, 0]]
[[-10]]
[[0, 0, 0], [0, 4, 11], [0, -4, -11]]
Bukan peringkat satu:
[[-2, 1], [2, 4]]
[[0, 0, 3], [-22, 0, 0]]
[[1, 2, 3], [2, 4, 6], [3, 6, 10]]
[[0, -2, 0, 0], [0, 0, 0, 1], [0, 0, -2, 0]]
Papan peringkat:
var QUESTION_ID=143528,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/143528/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>
MatrixRank@#==1&
Jawaban:
Jelly , 6 byte
Cobalah online!
Bagaimana itu bekerja
Presisi
Ær
menggunakan metode numerik, jadi hasilnya biasanya tidak eksak. Misalnya, input [6, -5, 1] , yang merepresentasikan polinomial 6 - 5x + x² , menghasilkan akar 3.0000000000000000004 dan 1.999999999999999898 . Namun, mengalikan semua koefisien polinomial dengan konstanta tidak nol yang sama menghasilkan akar yang sama-sama tidak eksak. Misalnya,Ær
mendapatkan akar yang sama untuk [6, -5, 1] dan [6 × 10 100 , -5 × 10 100 , 10 100 ] .Perlu dicatat bahwa ketepatan float dan tipe kompleks yang terbatas dapat menyebabkan kesalahan. Misalnya,
Ær
akan mendapatkan akar yang sama untuk [1, 1] dan [10 100 , 10 100 + 1] . Karena kita dapat mengasumsikan bahwa matriksnya tidak besar dan tidak secara khusus dipilih untuk diklasifikasi secara keliru , maka itu boleh saja.sumber
Haskell , 50 byte
r
mengambil daftar daftarInteger
s dan mengembalikanFalse
jika matriks memiliki peringkat satu,True
jika tidak.Cobalah online!
Bagaimana itu bekerja
a
danb
(termasuk baris yang sama), dan untuk setiap pasangan, memungkinkanx
dany
menjalankan elemen yang sesuai.b
demi barisx
dan barisa
demi barisy
. Matriks akan memiliki peringkat satu jika dan hanya jika hasilnya selalu sama.<
dapat digunakan untuk memeriksa apakah ada ketimpangan. Daftar hasil pengujian digabungkan denganor
, memberiTrue
jika ada baris yang tidak proporsional.sumber
Mathematica,
5133 byteMemasukkan
-14 byte dari user202729
3 byte lagi disimpan dari junghwanmin
sumber
First@#
, Anda dapat menghitung0First@#
karena 0 dikalikan dengan semuanya adalah 0, dan perkalian adalah daftar. Anda juga dapat mempertimbangkan menggunakanTr[1^<list>]
untuk menghitung panjang daftar.0#&@@#
,{0..}
akan bekerja juga. Dan kemudianInfix
berfungsi, sehingga kode akhir bisaRowReduce@#~Count~{0..}==Tr[1^#]-1&
, menghemat 2 byte.Except
bisa digunakan untuk menyingkirkanTr
barang. -3 byte:RowReduce@#~Count~Except@{0..}==1&
<2
dapat digunakan sebagai pengganti==1
.JavaScript (ES6),
686765 byteYang ini didasarkan pada jawaban 05AB1E Neil dan secara signifikan lebih efisien daripada pendekatan asli saya.
Pengembalian
false
untuk peringkat satu dantrue
sebaliknya.Uji kasus
Tampilkan cuplikan kode
Jawaban asli, 84 byte
Pengembalian
false
untuk peringkat satu dantrue
sebaliknya.Uji kasus
Tampilkan cuplikan kode
Bagaimana?
Pengurangan yang dilakukan pada akhir kode dapat menyebabkan berbagai situasi, yang dirangkum di bawah ini:
Tes gagal segera setelah kami mendapatkan nilai kebenaran: ini terjadi ketika kami menemukan dua rasio yang berbeda (selain 0/0 ) antara a (i, y) dan a (i, r) di setiap baris y dari matriks, di mana r adalah indeks dari baris yang tidak nol.
sumber
Python 2 + numpy, 58 byte
Cobalah online!
Penghargaan untuk ini .
sumber
1e-9
bukan1e-10
?Jelly , 12 byte
Cobalah online!
Penjelasan
Penjelasan mungkin sedikit salah karena ini adalah interpretasi saya tentang golf miles dari algoritma asli saya
-5 byte berkat mil
sumber
ẸÐfµ÷"ЀZE€Ẹ
TIO05AB1E , 16 byte
Cobalah online! Menggunakan properti tabel perkalian yang sudut-sudut yang berlawanan dari persegi panjang apa pun memiliki produk yang sama. Penjelasan:
sumber
TI-Basic (seri TI-83),
282728 byte (62 karakter)Menghitung bentuk eselon baris dari matriks
[A]
, menyimpan baris pertama (yang akan dibuang) diL₁
dan baris kedua diᶫX
. Makamax(abs(ᶫX
akan menjadi nol jikaᶫX
hanya terdiri dari nol, dan nilai positif sebaliknya, yangnot(
berubah menjadi 1 jika matriksnya adalah peringkat satu, 0 sebaliknya.Untuk matriks 1-baris,
ᶫX
disetel ke{0}
dan kemudian tidak berubah ketika kami mencoba melihat baris kedua dari matriks yang tidak ada.-1 byte terima kasih kepada Scott Milner
+1 byte untuk memperbaiki kesalahan dimensi untuk matriks 1-baris. Ternyata
Matr►list(
perintah mengeluh jika Anda mencoba untuk mengekstrak baris kedua dari sebuah matriks dengan hanya satu baris; namun, jika Anda mencoba mengekstrak baris pertama dan kedua dari matriks, ia akan gagal secara diam-diam.sumber
Prompt [A]
alih - alihAns→[A]
.ClrList
untuk menginisialisasiᶫX
, tetapi saya belum cukup berhasil melakukannya di ruang yang lebih sedikit.Matr►list(
akan menimpa daftar, meskipun tidak ada, dan Anda akan menghemat 5 byte.Brachylog , 27 byte
Cobalah online!
Menggunakan pendekatan Neil tentang "produk dari sudut yang berlawanan dari setiap kotak harus sama". Produk silang mahal dan membutuhkan 10 byte penuh, tetapi ini masih lebih pendek daripada pendekatan berbasis divisi yang saya coba, terutama karena penetapan dua output yang konsisten untuk kebenaran dan kepalsuan dalam pertanyaan - membuat kepalsuan hanya menjadi
false.
, dan tidak kadang-kadang kesalahan divide-by-zero, menggunakan terlalu banyak byte.Pendekatan alternatif berdasarkan pembagian elemen-bijaksana ( 30 byte ):
Cobalah online!
sumber
Jelly , 9 byte
Cobalah online!
sumber
SageMath, 40 byte
Cobalah online
Fungsi anonim ini kembali
False
jika matriksnya adalah peringkat satu, danTrue
sebaliknya.Fungsi ini mengambil matriks
M
sebagai input, mengubahnya menjadi bentuk eselon baris tereduksi (M.rref()
), dan menguji untukany
baris yang melewati yang pertama menjadi bukan nol. Kemudian, nilai itu dikalikan denganM.nrows()>1
(apakah matriks memiliki lebih dari satu baris?).sumber
Python 3 ,
9391 byteCobalah online!
Bagaimana itu bekerja
Cek apakah ada 2-minor yang memiliki penentu nol. Jika hal ini terjadi, peringkat harus setidaknya 2: "P-minor non-vanishing (p × p submatrix dengan determinan non-nol) menunjukkan bahwa baris dan kolom dari submatrix tersebut bebas linear, dan dengan demikian baris dan kolom dari matriks penuh adalah bebas linier (dalam matriks penuh), sehingga peringkat baris dan kolom setidaknya sama besar dengan peringkat penentu "(dari Wikipedia )
Catatan: mencukur dua byte berkat komentar pengguna71546.
sumber
f=
:lambda m,e=enumerate:any(h*g-r[j]*s[i]for r in m for i,h in e(r)for s in m for j,g in e(s))
Pari / GP , 18 byte
matimage
memberikan dasar dari gambar transformasi linier yang didefinisikan oleh matriks.Cobalah online!
sumber