Testen Sie anhand einer Ganzzahlmatrix, ob es sich um eine Rang-1-Matrix handelt. Dies bedeutet, dass jede Zeile ein Vielfaches desselben Vektors ist. Zum Beispiel in
2 0 -20 10
-3 0 30 -15
0 0 0 0
Jede Zeile ist ein Vielfaches von 1 0 -10 5
.
Dieselbe Definition gilt auch für Spalten anstelle von Zeilen. Alternativ hat eine Matrix den ersten Rang, wenn es sich um eine Multiplikationstabelle handelt:
* 1 0 -10 5
----------------
2 | 2 0 -20 10
-3 | -3 0 30 -15
0 | 0 0 0 0
Wir haben Zeilenbeschriftungen r[i]
und Spaltenbeschriftungen zugewiesen , c[j]
sodass jeder Matrixeintrag M[i][j]
das Produkt der entsprechenden Beschriftungen als ist M[i][j] = r[i] * c[j]
.
Eingang:
Eine ganzzahlige Matrix als 2D-Container Ihrer Wahl. Zum Beispiel eine Liste von Listen, ein 2D-Array oder ähnliches. Sie sollten die Breite oder Höhe nicht als zusätzliche Eingabe verwenden, es sei denn, das Array-Format erfordert dies.
Die Matrix kann nicht quadratisch sein. Es wird mindestens einen Eintrag ungleich Null haben - Sie müssen sich nicht mit leeren oder Null-Matrizen befassen.
Sie können davon ausgehen, dass die Ganzzahlen keine Überlaufprobleme verursachen.
Ausgabe:
Ein konsistenter Wert für Rang-1-Matrizen und ein anderer konsistenter Wert für andere Matrizen.
Eingebaute:
Sie dürfen keine eingebauten Funktionen verwenden, um Rang 1 zu berechnen oder direkt zu überprüfen. Sie können auch andere integrierte Funktionen wie Eigenwerte, Zerlegungen usw. verwenden. Ich empfehle jedoch, Antworten zu wählen, für die die meisten Aufgaben nicht integriert sind.
Testfälle:
Rang eins:
[[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]]
Nicht Rang eins:
[[-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]]
Bestenliste:
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&
Antworten:
Gelee , 6 Bytes
Probieren Sie es online!
Wie es funktioniert
Präzision
Ær
verwendet numerische Methoden, so dass die Ergebnisse in der Regel ungenau sind. Beispielsweise ergibt der Eingang [6, -5, 1] , der das Polynom 6 - 5x + x² darstellt , die Wurzeln 3.0000000000000004 und 1.99999999999998 . Das Multiplizieren aller Koeffizienten eines Polynoms mit derselben Nicht-Null-Konstante führt jedoch zu gleichermaßen ungenauen Wurzeln. Ermittelt zum BeispielÆr
die gleichen Wurzeln für [6, -5, 1] und [6 × 10 100 , -5 × 10 100 , 10 100 ] .Es sei darauf hingewiesen , dass die begrenzte Genauigkeit der Schwimmer und komplexen Typen können zu Fehlern führen. Zum Beispiel
Ær
würde man die gleichen Wurzeln für [1, 1] und [10 100 , 10 100 + 1] erhalten . Da wir davon ausgehen können, dass die Matrix nicht groß und nicht speziell für eine Fehlklassifizierung ausgewählt ist, sollte dies in Ordnung sein.quelle
Haskell , 50 Bytes
r
Nimmt eine Liste von Listen vonInteger
s und gibt zurück,False
wenn die Matrix Rang eins hat,True
ansonsten.Probieren Sie es online!
Wie es funktioniert
a
undb
(einschließlich der Gleich Zeilen), und für jedes Paar, läßtx
undy
laufen durch entsprechende Elemente.b
mitx
und die Reihea
mity
. Die Matrix hat genau dann den ersten Rang, wenn die Ergebnisse immer gleich sind.<
kann damit geprüft werden, ob jemals eine Ungleichung vorliegt. Die Liste der Testergebnisse wird mit kombiniertor
und gibt an,True
ob nicht proportionale Zeilen vorhanden sind.quelle
Mathematica,
5133 BytesEingang
-14 bytes von user202729
3 weitere bytes von junghwanmin gespeichert
quelle
First@#
berechnen können,0First@#
da 0 mit 0 multipliziert wird und die Multiplikation auflistbar ist. Sie können auch in Betracht ziehenTr[1^<list>]
, die Länge einer Liste mit zu berechnen.0#&@@#
,{0..}
würde auch funktionieren. Und dannInfix
funktioniert es, also könnte der endgültige CodeRowReduce@#~Count~{0..}==Tr[1^#]-1&
2 Bytes einsparen.Except
kann verwendet werden, umTr
Sachen loszuwerden . -3 Bytes:RowReduce@#~Count~Except@{0..}==1&
<2
kann daher anstelle von verwendet werden==1
.JavaScript (ES6),
686765 BytesDieser basiert auf Neils 05AB1E-Antwort und ist bedeutend effizienter als mein ursprünglicher Ansatz.
Gibt
false
für Rang eins undtrue
sonst zurück.Testfälle
Code-Snippet anzeigen
Ursprüngliche Antwort, 84 Bytes
Gibt
false
für Rang eins undtrue
sonst zurück.Testfälle
Code-Snippet anzeigen
Wie?
Die Subtraktion, die am Ende des Codes ausgeführt wird, kann zu vielen verschiedenen Situationen führen, die im Folgenden zusammengefasst sind:
Der Test fehlschlägt, sobald wir einen truthy Wert zu erhalten: dies geschieht , wenn wir begegnen zwei unterschiedliche Verhältnisse (ausgenommen 0/0 ) , die zwischen a (i, y) und a (i, r) in einem beliebigen Zeile y der Matrix, wobei r ist der Index einer Zeile ungleich Null.
quelle
Python 2 + Anzahl, 58 Bytes
Probieren Sie es online!
Gut so .
quelle
1e-9
statt verwenden1e-10
?Gelee , 12 Bytes
Probieren Sie es online!
Erläuterung
Die Erklärung ist möglicherweise etwas falsch, da dies meine Interpretation des Meilengolfs meines ursprünglichen Algorithmus ist
-5 Bytes dank Meilen
quelle
ẸÐfµ÷"ЀZE€Ẹ
TIO05AB1E , 16 Bytes
Probieren Sie es online! Verwendet die Multiplikationstabelleneigenschaft, dass die gegenüberliegenden Ecken eines Rechtecks dasselbe Produkt haben. Erläuterung:
quelle
TI-Basic (TI-83-Serie),
282728 Byte (62 Zeichen)Berechnet die Reihenform der Matrix
[A]
, speichert die erste (zu verwerfende) ReiheL₁
und die zweite Reihe inᶫX
. Dannmax(abs(ᶫX
ist Null, wenn esᶫX
nur aus Nullen besteht, und ansonsten ein positiver Wert, dernot(
sich in 1 ändert, wenn die Matrix den Rang Eins hat, andernfalls 0.Bei einer einzeiligen Matrix
ᶫX
wird festgelegt, dass{0}
und wird dann nicht geändert, wenn versucht wird, die nicht vorhandene zweite Zeile der Matrix zu betrachten.-1 Byte dank Scott Milner
+1 Byte, um den Dimensionsfehler für 1-Zeilen-Matrizen zu beheben. Der
Matr►list(
Befehl beschwert sich, wenn Sie versuchen, die zweite Zeile aus einer Matrix mit nur einer Zeile zu extrahieren. Wenn Sie jedoch versuchen, die erste und die zweite Zeile aus der Matrix zu extrahieren, schlägt dies unbemerkt fehl.quelle
Prompt [A]
anstelle von speichernAns→[A]
.ClrList
Initialisieren verwendenᶫX
, aber ich habe es nicht ganz verstanden, um auf weniger Raum zu arbeiten.Matr►list(
die Liste überschrieben wird, auch wenn sie nicht vorhanden ist, und Sie sparen 5 Bytes.Brachylog , 27 Bytes
Probieren Sie es online!
Verwendet Neils Ansatz "Produkte mit entgegengesetzten Ecken jedes Rechtecks sollten gleich sein". Kreuzprodukt ist teuer und benötigt 10 ganze Bytes, aber dies ist immer noch kürzer als jeder divisionsbasierte Ansatz, den ich ausprobiert habe, hauptsächlich aufgrund der Vorgabe von zwei konsistenten Ausgaben für Wahrhaftigkeit und Falschheit in der Frage - Falschheit ist nur eine
false.
, und nicht manchmal eine Fehler beim Teilen durch Null, verwendet zu viele Bytes.Alternativer Ansatz basierend auf elementweiser Aufteilung ( 30 Bytes ):
Probieren Sie es online!
quelle
Gelee , 9 Bytes
Probieren Sie es online!
quelle
SageMath, 40 Bytes
Probieren Sie es online aus
Diese anonyme Funktion gibt zurück,
False
wenn die Matrix den ersten Rang hat,True
andernfalls.Die Funktion nimmt eine Matrix
M
als Eingabe, konvertiert sie in eine reduzierte Zeilen-Staffel-Form (M.rref()
) und prüft, obany
die Zeilen nach der ersten nicht Null sind. Dann wird dieser Wert mit multipliziertM.nrows()>1
(hat die Matrix mehr als eine Zeile?).quelle
Python 3 ,
9391 BytesProbieren Sie es online!
Wie es funktioniert
Prüft, ob eine 2-Moll-Zahl eine Determinante ungleich Null hat. Wenn dies der Fall ist, muss der Rang mindestens 2 sein: "Ein nicht verschwindendes p-Moll (p × p-Submatrix mit Nicht-Null-Determinante) zeigt, dass die Zeilen und Spalten dieser Submatrix linear unabhängig sind, und somit diese Zeilen und Spalten der Vollmatrix sind linear unabhängig (in der Vollmatrix), daher sind der Zeilen- und Spaltenrang mindestens so groß wie der Determinantenrang "(aus Wikipedia )
Hinweis: Dank des Kommentars von user71546 wurden zwei Bytes rasiert.
quelle
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 Bytes
matimage
Gibt eine Basis für das durch die Matrix definierte Bild der linearen Transformation.Probieren Sie es online!
quelle