Biorąc pod uwagę macierz liczb całkowitych, sprawdź, czy jest na pierwszym miejscu, co oznacza, że każdy wiersz jest wielokrotnością tego samego wektora. Na przykład w
2 0 -20 10
-3 0 30 -15
0 0 0 0
każdy rząd jest wielokrotnością 1 0 -10 5
.
Ta sama definicja działa również z kolumnami zamiast wierszy. Alternatywnie macierz jest na pierwszym miejscu, jeśli jest jak tabliczka mnożenia:
* 1 0 -10 5
----------------
2 | 2 0 -20 10
-3 | -3 0 30 -15
0 | 0 0 0 0
Przypisaliśmy etykiety wierszy r[i]
i kolumny, c[j]
aby każdy wpis macierzy M[i][j]
był iloczynem odpowiednich etykiet as M[i][j] = r[i] * c[j]
.
Wkład:
Macierz liczb całkowitych jako wybrany kontener 2D. Na przykład lista list, tablica 2D lub podobne. Nie należy traktować szerokości ani wysokości jako dodatkowych danych wejściowych, chyba że wymaga tego format tablicy.
Matryca może być niekwadratowa. Będzie miał co najmniej jeden niezerowy wpis - nie musisz zajmować się pustymi lub zerowymi matrycami.
Możesz założyć, że liczby całkowite nie spowodują problemów z przepełnieniem.
Wydajność:
Spójna wartość dla macierzy pierwszego rzędu i inna spójna wartość dla innych macierzy.
Wbudowane:
Nie możesz używać żadnego wbudowanego do obliczania rangi ani bezpośrednio sprawdzać rangi 1. Możesz użyć innych wbudowanych wartości, takich jak wartości własne, dekompozycje itp., Ale zachęcam do głosowania na odpowiedzi, które nie mają wbudowanych, wykonują większość pracy.
Przypadki testowe:
1. miejsce:
[[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]]
Nie na pierwszym miejscu:
[[-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]]
Tabela liderów:
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&
Odpowiedzi:
Galaretka , 6 bajtów
Wypróbuj online!
Jak to działa
Precyzja
Ær
używa metod numerycznych, więc jego wyniki są zwykle niedokładne. Na przykład dane wejściowe [6, -5, 1] , które reprezentują wielomian 6–5x + x² , dają pierwiastki 3,0000000000000004 i 1,9999999999999998 . Jednak pomnożenie wszystkich współczynników wielomianu przez tę samą niezerową stałą powoduje równie niedokładne pierwiastki. Na przykładÆr
uzyskuje te same pierwiastki dla [6, -5, 1] i [6 × 10 100 , -5 × 10 100 , 10 100 ] .Należy zauważyć, że ograniczona precyzja pływaka i typów złożonych może prowadzić do błędów. Na przykład
Ær
uzyskałby te same pierwiastki dla [1, 1] i [10 100 , 10 100 + 1] . Ponieważ możemy założyć, że matryca nie jest duża i nie została specjalnie wybrana do błędnej klasyfikacji , to powinno być w porządku.źródło
Haskell , 50 bajtów
r
pobiera listę listInteger
s i zwraca,False
jeśli macierz ma rangę 1, wTrue
przeciwnym razie.Wypróbuj online!
Jak to działa
a
ib
(w tym równe rzędy), a dla każdej pary pozwalax
iy
przebiega przez odpowiednie elementy.b
przezx
i rząda
przezy
. Macierz będzie miała rangę 1 wtedy i tylko wtedy, gdy wyniki będą zawsze równe.<
można ich użyć do sprawdzenia, czy kiedykolwiek występuje nierówność. Lista wyników testu jest łączona zor
podaniem,True
jeśli istnieją wiersze nieproporcjonalne.źródło
Mathematica,
5133 bajtówWkład
-14 bajtów od user202729 Jeszcze
3 bajty zapisane od junghwanmin
źródło
First@#
, można obliczyć,0First@#
ponieważ 0 mnoży ze wszystkim wynosi 0, a mnożenie można wyliczyć. Możesz także rozważyć użycieTr[1^<list>]
do obliczenia długości listy.0#&@@#
,{0..}
będzie działać zbyt. A potemInfix
działa, więc końcowy kod może byćRowReduce@#~Count~{0..}==Tr[1^#]-1&
, oszczędzając 2 bajty.Except
można go użyć do pozbycia sięTr
rzeczy. -3 bajty:RowReduce@#~Count~Except@{0..}==1&
<2
można jej użyć zamiast==1
.JavaScript (ES6),
686765 bajtówTen oparty jest na odpowiedzi Neila 05AB1E i jest znacznie bardziej wydajny niż moje oryginalne podejście.
Zwraca
false
za miejsce pierwsze itrue
inne.Przypadki testowe
Pokaż fragment kodu
Oryginalna odpowiedź, 84 bajtów
Zwraca
false
za miejsce pierwsze itrue
inne.Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Odejmowanie przeprowadzane na końcu kodu może prowadzić do wielu różnych sytuacji, które zostały podsumowane poniżej:
Test nie tak szybko, jak to uzyskać wartość truthy: to się dzieje, gdy mamy do czynienia z dwóch różnych wskaźników (inne niż 0/0 ) między a (i, y) i a (i, R) w każdym rzędzie Y matrycy, gdzie r jest indeksem niezerowego wiersza.
źródło
Python 2 + numpy, 58 bajtów
Wypróbuj online!
Uznanie za to .
źródło
1e-9
zamiast1e-10
?Galaretka , 12 bajtów
Wypróbuj online!
Wyjaśnienie
Wyjaśnienie może być nieco niepoprawne, ponieważ jest to moja interpretacja golfa mil mojego oryginalnego algorytmu
-5 bajtów dzięki milom
źródło
ẸÐfµ÷"ЀZE€Ẹ
TIO05AB1E , 16 bajtów
Wypróbuj online! Wykorzystuje właściwość tablicy mnożenia, że przeciwległe rogi dowolnego prostokąta mają ten sam produkt. Wyjaśnienie:
źródło
TI-Basic (seria TI-83),
282728 bajtów (62 znaki)Oblicza formę macierzy
[A]
i szeregu, zapisuje pierwszy wiersz (do odrzucenia)L₁
i drugi wiersz wᶫX
. Wtedymax(abs(ᶫX
będzie zero, jeśliᶫX
składa się tylko z zer, a w przeciwnym razie wartość dodatnia, któranot(
zmienia się na 1, jeśli macierz ma rangę 1, w przeciwnym razie 0.W przypadku macierzy 1-wierszowej
ᶫX
jest ustawiona na,{0}
a następnie nie ulega zmianie, gdy próbujemy spojrzeć na nieistniejący drugi wiersz matrycy.-1 bajt dzięki Scott Milner
+1 bajt, aby naprawić błąd wymiaru dla macierzy 1-rzędowych. Okazuje się, że
Matr►list(
polecenie narzeka, jeśli spróbujesz wyodrębnić drugi wiersz z macierzy za pomocą tylko jednego wiersza; jeśli jednak spróbujesz wyodrębnić pierwszy i drugi wiersz z macierzy, nastąpi to po cichu.źródło
Prompt [A]
zamiastAns→[A]
.ClrList
inicjalizacjaᶫX
, ale nie do końca dostałem to do pracy na mniejszej przestrzeni.Matr►list(
zastąpi listę, nawet jeśli ona nie istnieje, a zaoszczędzisz 5 bajtów.Brachylog , 27 bajtów
Wypróbuj online!
Wykorzystuje podejście Neila, że „iloczyn przeciwległych narożników każdego prostokąta powinien być równy”. Produkt krzyżowy jest kosztowny i zajmuje 10 pełnych bajtów, ale wciąż jest krótszy niż jakakolwiek metoda oparta na podziale, którą wypróbowałem, głównie z powodu ustalenia dwóch spójnych wyników dla prawdy i falseya w pytaniu - czyniąc falsey tylko
false.
, a nie czasem błąd dzielenia przez zero, zużywa zbyt wiele bajtów.Alternatywne podejście oparte na podziale na elementy ( 30 bajtów ):
Wypróbuj online!
źródło
Galaretka , 9 bajtów
Wypróbuj online!
źródło
SageMath, 40 bajtów
Wypróbuj online
Ta anonimowa funkcja zwraca,
False
jeśli macierz jest na pierwszym miejscu, i wTrue
przeciwnym razie.Ta funkcja pobiera macierz
M
jako dane wejściowe, konwertuje ją na zredukowaną formę (M.rref()
) wiersza-echelon i sprawdza,any
czy wiersze za pierwszym nie są zerowe. Następnie wartość ta jest mnożona przezM.nrows()>1
(czy macierz ma więcej niż jeden wiersz?).źródło
Python 3 ,
9391 bajtówWypróbuj online!
Jak to działa
Sprawdza, czy jakikolwiek 2-moll ma niezerową determinantę. Jeśli tak jest, ranga musi wynosić co najmniej 2: „Nie znikająca p-moll (submatrix p × p z determinantą niezerową) pokazuje, że wiersze i kolumny tej submatrix są liniowo niezależne, a zatem te wiersze i kolumny pełnej macierzy są liniowo niezależne (w pełnej macierzy), więc ranga wiersza i kolumny jest co najmniej tak duża jak ranga determinantyczna "(od Wikipedii )
Uwaga: ogolono dwa bajty dzięki komentarzowi użytkownika user71546.
źródło
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 bajtów
matimage
daje podstawę obrazu transformacji liniowej zdefiniowanej przez macierz.Wypróbuj online!
źródło