Dada una matriz de enteros, pruebe si es de rango uno, lo que significa que cada fila es un múltiplo del mismo vector. Por ejemplo, en
2 0 -20 10
-3 0 30 -15
0 0 0 0
cada fila es un múltiplo de 1 0 -10 5
.
La misma definición también funciona con columnas en lugar de filas. Alternativamente, una matriz es de rango uno si es como una tabla de multiplicar:
* 1 0 -10 5
----------------
2 | 2 0 -20 10
-3 | -3 0 30 -15
0 | 0 0 0 0
Hemos asignado etiquetas de fila r[i]
y etiquetas de columna c[j]
para que cada entrada de matriz M[i][j]
sea el producto de las etiquetas correspondientes como M[i][j] = r[i] * c[j]
.
Entrada:
Una matriz entera como contenedor 2D de su elección. Por ejemplo, una lista de listas, una matriz 2D o similar. No debe tomar el ancho o la altura como entradas adicionales a menos que el formato de matriz lo requiera.
La matriz puede ser no cuadrada. Tendrá al menos una entrada distinta de cero: no tiene que lidiar con matrices vacías o cero.
Puede suponer que los enteros no causarán problemas de desbordamiento.
Salida:
Un valor consistente para matrices de rango uno, y un valor consistente diferente para otras matrices.
Incorporados:
No puede utilizar ninguna función integrada para calcular el rango o verificar directamente el rango uno. Puede usar otros elementos integrados, como valores propios, descomposiciones, etc., pero le recomiendo que vote por respuestas que no tienen elementos integrados que hacen la mayor parte del trabajo.
Casos de prueba:
Rango uno:
[[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]]
No rango uno:
[[-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]]
Tabla de clasificación:
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&
Respuestas:
Jalea , 6 bytes
Pruébalo en línea!
Cómo funciona
Precisión
Ær
utiliza métodos numéricos, por lo que sus resultados suelen ser inexactos. Por ejemplo, la entrada [6, -5, 1] , que representa el polinomio 6 - 5x + x² , da como resultado las raíces 3.0000000000000004 y 1.9999999999999998 . Sin embargo, multiplicar todos los coeficientes de un polinomio por la misma constante que no sea cero da como resultado raíces igualmente inexactas. Por ejemplo,Ær
obtiene las mismas raíces para [6, -5, 1] y [6 × 10 100 , -5 × 10 100 , 10 100 ] .Cabe señalar que la precisión limitada del flotador y los tipos complejos pueden conducir a errores. Por ejemplo,
Ær
obtendría las mismas raíces para [1, 1] y [10 100 , 10 100 + 1] . Como podemos suponer que la matriz no es grande y no está elegida específicamente para ser mal clasificada , eso debería estar bien.fuente
Haskell , 50 bytes
r
toma una lista de listas deInteger
sy devuelveFalse
si la matriz tiene rango uno, de loTrue
contrario.Pruébalo en línea!
Cómo funciona
a
yb
(incluidas las filas iguales), y para cada par, permitex
yy
ejecuta los elementos correspondientes.b
porx
y la filaa
pory
. La matriz tendrá rango uno si y solo si los resultados son siempre iguales.<
se pueden usar para verificar si alguna vez hay una desigualdad. La lista de resultados de la prueba se combina conor
, dandoTrue
si hay filas no proporcionales.fuente
Mathematica,
5133 bytesEntrada
-14 bytes del usuario202729
3 bytes más guardados de junghwanmin
fuente
First@#
, puede calcular,0First@#
ya que 0 se multiplica con todo es 0, y la multiplicación es listable. También puede considerar usarTr[1^<list>]
para calcular la longitud de una lista.0#&@@#
,{0..}
funcionaría también. Y luegoInfix
funciona, por lo que el código final podría serRowReduce@#~Count~{0..}==Tr[1^#]-1&
, ahorrando 2 bytes.Except
se puede usar para deshacerse de lasTr
cosas. -3 bytes:RowReduce@#~Count~Except@{0..}==1&
<2
se puede utilizar en lugar de==1
.JavaScript (ES6),
686765 bytesEste se basa en la respuesta 05AB1E de Neil y es significativamente más eficiente que mi enfoque original.
Devoluciones
false
para rango uno y detrue
otra manera.Casos de prueba
Mostrar fragmento de código
Respuesta original, 84 bytes
Devoluciones
false
para rango uno y detrue
otra manera.Casos de prueba
Mostrar fragmento de código
¿Cómo?
La resta que se realiza al final del código puede conducir a muchas situaciones diferentes, que se resumen a continuación:
La prueba falla tan pronto como obtenemos un valor Truthy: esto ocurre cuando nos encontramos con dos proporciones diferentes (distintos de 0/0 ) entre un (i, y) y a (i, r) en cualquier fila y de la matriz, donde r es el índice de una fila distinta de cero.
fuente
Python 2 + numpy, 58 bytes
Pruébalo en línea!
Crédito a esto .
fuente
1e-9
lugar de1e-10
?Jalea , 12 bytes
Pruébalo en línea!
Explicación
La explicación puede ser ligeramente incorrecta ya que esta es mi interpretación del golf de millas de mi algoritmo original
-5 bytes gracias a millas
fuente
ẸÐfµ÷"ЀZE€Ẹ
TIO05AB1E , 16 bytes
Pruébalo en línea! Utiliza la propiedad de la tabla de multiplicar de que las esquinas opuestas de cualquier rectángulo tienen el mismo producto. Explicación:
fuente
TI-Basic (serie TI-83),
282728 bytes (62 caracteres)Calcula la forma fila-escalón de la matriz
[A]
, almacena su primera fila (para descartar)L₁
y su segunda filaᶫX
. Entoncesmax(abs(ᶫX
será cero siᶫX
consta solo de ceros, y un valor positivo de lo contrario, quenot(
cambia a 1 si la matriz es de rango uno, 0 de lo contrario.Para una matriz de 1 fila,
ᶫX
se establece en{0}
y luego no cambia cuando intentamos mirar la segunda fila inexistente de la matriz.-1 byte gracias a Scott Milner
+1 byte para corregir el error de dimensión para matrices de 1 fila. Resulta que el
Matr►list(
comando se queja si intenta extraer la segunda fila de una matriz con solo una fila; sin embargo, si intenta extraer la primera y la segunda fila de la matriz, fallará en silencio.fuente
Prompt [A]
lugar deAns→[A]
.ClrList
inicializarᶫX
, pero no he logrado que funcione en menos espacio.Matr►list(
que sobrescribirá la lista, incluso si no existe, y ahorrará 5 bytes.Brachylog , 27 bytes
Pruébalo en línea!
Utiliza el enfoque de Neil de "los productos de las esquinas opuestas de cada rectángulo deben ser iguales". El producto cruzado es costoso y toma 10 bytes completos, pero esto es aún más corto que cualquier enfoque basado en la división que probé, principalmente debido a la estipulación de dos resultados consistentes para la verdad y falsey en la pregunta, lo que hace que falsey sea solo un
false.
, y no a veces un error de división por cero, utiliza demasiados bytes.Enfoque alternativo basado en la división por elementos ( 30 bytes ):
Pruébalo en línea!
fuente
Jalea , 9 bytes
Pruébalo en línea!
fuente
SageMath, 40 bytes
Pruébalo en línea
Esta función anónima regresa
False
si la matriz es de rango uno, y de loTrue
contrario.La función toma una matriz
M
como entrada, la convierte en una forma reducida de fila-escalón (M.rref()
) y comprueba siany
las filas más allá de la primera no son cero. Entonces, ese valor se multiplica porM.nrows()>1
(¿la matriz tiene más de una fila?).fuente
Python 3 ,
9391 bytesPruébalo en línea!
Cómo funciona
Comprueba si algún 2-menor tiene un determinante distinto de cero. Si este es el caso, el rango debe ser al menos 2: "Una p-menor que no desaparece (submatriz p × p con determinante distinto de cero) muestra que las filas y columnas de esa submatriz son linealmente independientes y, por lo tanto, esas filas y las columnas de la matriz completa son linealmente independientes (en la matriz completa), por lo que el rango de fila y columna es al menos tan grande como el rango determinante "(de Wikipedia )
Nota: afeitó dos bytes gracias al comentario de user71546.
fuente
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
da una base de la imagen de la transformación lineal definida por la matriz.Pruébalo en línea!
fuente