Étant donné une matrice d'entiers, testez si elle est de rang un, ce qui signifie que chaque ligne est un multiple du même vecteur. Par exemple, dans
2 0 -20 10
-3 0 30 -15
0 0 0 0
chaque ligne est un multiple de 1 0 -10 5
.
La même définition fonctionne également avec des colonnes à la place des lignes. Alternativement, une matrice est de premier rang si elle ressemble à une table de multiplication:
* 1 0 -10 5
----------------
2 | 2 0 -20 10
-3 | -3 0 30 -15
0 | 0 0 0 0
Nous avons attribué des étiquettes de ligne r[i]
et des étiquettes de colonne c[j]
afin que chaque entrée de matrice M[i][j]
soit le produit des étiquettes correspondantes en tant que M[i][j] = r[i] * c[j]
.
Contribution:
Une matrice entière comme conteneur 2D de votre choix. Par exemple, une liste de listes, un tableau 2D ou similaire. Vous ne devez pas prendre la largeur ou la hauteur comme entrées supplémentaires, sauf si le format du tableau l'exige.
La matrice peut être non carrée. Il aura au moins une entrée différente de zéro - vous n'avez pas à gérer des matrices vides ou nulles.
Vous pouvez supposer que les entiers ne causeront pas de problèmes de débordement.
Sortie:
Une valeur cohérente pour les matrices de rang 1 et une valeur cohérente différente pour les autres matrices.
Intégrés:
Vous ne pouvez pas utiliser de fonction intégrée pour calculer le rang ou vérifier directement le rang un. Vous pouvez utiliser d'autres valeurs intégrées comme les valeurs propres, les décompositions, etc., mais j'encourage les réponses de vote ascendant qui n'ont pas de valeurs intégrées font la plupart du travail.
Cas de test:
Rang un:
[[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]]
Pas le premier:
[[-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]]
Classement:
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&
Réponses:
Gelée , 6 octets
Essayez-le en ligne!
Comment ça marche
Précision
Ær
utilise des méthodes numériques, donc ses résultats sont généralement inexacts. Par exemple, l'entrée [6, -5, 1] , qui représente le polynôme 6 - 5x + x² , donne les racines 3.0000000000000004 et 1.9999999999999998 . Cependant, la multiplication de tous les coefficients d'un polynôme par la même constante non nulle entraîne des racines également inexactes. Par exemple,Ær
obtient les mêmes racines pour [6, -5, 1] et [6 × 10 100 , -5 × 10 100 , 10 100 ] .Il convient de noter que la précision limitée des types flottants et complexes peut entraîner des erreurs. Par exemple,
Ær
obtiendrait les mêmes racines pour [1, 1] et [10 100 , 10 100 + 1] . Puisque nous pouvons supposer que la matrice n'est pas grande et n'est pas spécifiquement choisie pour être mal classée , cela devrait être bien.la source
Haskell , 50 octets
r
prend une liste de listes deInteger
s et retourneFalse
si la matrice a le rang un,True
sinon.Essayez-le en ligne!
Comment ça marche
a
etb
(y compris les lignes égales), et pour chaque paire, permetx
ety
exécute les éléments correspondants.b
parx
et la lignea
pary
. La matrice aura un rang si et seulement si les résultats sont toujours égaux.<
peuvent être utilisées pour vérifier s'il y a jamais une inégalité. La liste des résultats des tests est combinée avecor
, indiquantTrue
s'il y a des lignes non proportionnelles.la source
Mathematica,
5133 octetsContribution
-14 octets de user202729
3 octets supplémentaires enregistrés à partir de junghwanmin
la source
First@#
, vous pouvez calculer0First@#
puisque 0 multiplie avec tout est 0 et que la multiplication est listable. Vous pouvez également envisager d'utiliserTr[1^<list>]
pour calculer la longueur d'une liste.0#&@@#
,{0..}
cela fonctionnerait aussi. Et puisInfix
fonctionne, donc le code final pourrait êtreRowReduce@#~Count~{0..}==Tr[1^#]-1&
, en économisant 2 octets.Except
peut être utilisé pour se débarrasser deTr
choses. -3 octets:RowReduce@#~Count~Except@{0..}==1&
<2
peut être utilisé à la place de==1
.JavaScript (ES6),
686765 octetsCelui-ci est basé sur la réponse 05AB1E de Neil et est nettement plus efficace que mon approche d'origine.
Retourne
false
pour le rang un ettrue
autrement.Cas de test
Afficher l'extrait de code
Réponse originale, 84 octets
Retourne
false
pour le rang un ettrue
autrement.Cas de test
Afficher l'extrait de code
Comment?
La soustraction qui est effectuée à la fin du code peut conduire à de nombreuses situations différentes, qui sont résumées ci-dessous:
Le test échoue dès que nous obtenons une valeur de truthy: cela se produit lorsque nous rencontrons deux rapports distincts (autres que 0/0 ) entre un (i, y) et un (i, r) dans une ligne y de la matrice, où r est l'indice d'une ligne non nulle.
la source
Python 2 + numpy, 58 octets
Essayez-le en ligne!
C'est le mérite de cela .
la source
1e-9
place de1e-10
?Gelée , 12 octets
Essayez-le en ligne!
Explication
L'explication peut être légèrement incorrecte car il s'agit de mon interprétation du golf de miles de mon algorithme d'origine
-5 octets grâce aux miles
la source
ẸÐfµ÷"ЀZE€Ẹ
TIO05AB1E , 16 octets
Essayez-le en ligne! Utilise la propriété de table de multiplication selon laquelle les coins opposés de n'importe quel rectangle ont le même produit. Explication:
la source
TI-Basic (série TI-83),
282728 octets (62 caractères)Calcule la forme échelon ligne de la matrice
[A]
, stocke sa première ligne (à supprimer) dansL₁
et sa deuxième ligne dansᶫX
. Ilmax(abs(ᶫX
sera alors nul si seᶫX
compose uniquement de zéros et d'une valeur positive dans le cas contraire, quinot(
passe à 1 si la matrice est de rang un, 0 sinon.Pour une matrice à 1 ligne,
ᶫX
est défini sur{0}
puis ne change pas lorsque nous essayons de regarder la deuxième ligne inexistante de la matrice.-1 octet grâce à Scott Milner
+1 octet pour corriger l'erreur de dimension pour les matrices à 1 ligne. Il s'avère que la
Matr►list(
commande se plaint si vous essayez d'extraire la deuxième ligne d'une matrice avec une seule ligne; cependant, si vous essayez d'extraire les première et deuxième lignes de la matrice, cela échouera en silence.la source
Prompt [A]
au lieu deAns→[A]
.ClrList
pour initialiserᶫX
, mais je n'ai pas tout à fait réussi à travailler dans moins d'espace.Matr►list(
va écraser la liste, même si elle n'existe pas, et vous économiserez 5 octets.Brachylog , 27 octets
Essayez-le en ligne!
Utilise l'approche de Neil selon laquelle "les produits des coins opposés de chaque rectangle doivent être égaux". Le produit croisé est coûteux et prend 10 octets entiers, mais c'est toujours plus court que n'importe quelle approche basée sur la division que j'ai essayée, principalement en raison de la stipulation de deux sorties cohérentes pour truey et falsey dans la question - faire de falsey seulement un
false.
, et pas parfois un erreur de division par zéro, utilise trop d'octets.Approche alternative basée sur la division par élément ( 30 octets ):
Essayez-le en ligne!
la source
Gelée , 9 octets
Essayez-le en ligne!
la source
SageMath, 40 octets
Essayez-le en ligne
Cette fonction anonyme renvoie
False
si la matrice est de premier rang, etTrue
sinon.La fonction prend une matrice
M
en entrée, la convertit en forme d'échelon de ligne réduite (M.rref()
) et teste queany
les lignes après la première sont non nulles. Ensuite, cette valeur est multipliée parM.nrows()>1
(la matrice a-t-elle plus d'une ligne?).la source
Python 3 ,
9391 octetsEssayez-le en ligne!
Comment ça marche
Vérifie si un mineur de 2 a un déterminant non nul. Si tel est le cas, le rang doit être d'au moins 2: "Un p-mineur non disparaissant (sous-matrice p × p avec déterminant non nul) montre que les lignes et les colonnes de cette sous-matrice sont linéairement indépendantes, et donc ces lignes et les colonnes de la matrice complète sont linéairement indépendantes (dans la matrice complète), de sorte que le rang des lignes et des colonnes est au moins aussi grand que le rang déterminant "(d'après Wikipedia )
Remarque: rasé de deux octets grâce au commentaire de user71546.
la source
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 octets
matimage
donne une base à l'image de la transformation linéaire définie par la matrice.Essayez-le en ligne!
la source