Dada uma matriz de números inteiros, teste se é o número um, o que significa que cada linha é um múltiplo do mesmo vetor. Por exemplo, em
2 0 -20 10
-3 0 30 -15
0 0 0 0
cada linha é um múltiplo de 1 0 -10 5
.
A mesma definição também funciona com colunas no lugar de linhas. Como alternativa, uma matriz é classificada como um, se for como uma tabela de multiplicação:
* 1 0 -10 5
----------------
2 | 2 0 -20 10
-3 | -3 0 30 -15
0 | 0 0 0 0
Atribuímos rótulos de linha r[i]
e de coluna c[j]
para que cada entrada da matriz M[i][j]
seja o produto dos rótulos correspondentes como M[i][j] = r[i] * c[j]
.
Entrada:
Uma matriz inteira como um contêiner 2D de sua escolha. Por exemplo, uma lista de listas, uma matriz 2D ou similar. Você não deve usar a largura ou a altura como entradas adicionais, a menos que o formato da matriz exija.
A matriz pode ser não quadrada. Ele terá pelo menos uma entrada diferente de zero - você não precisa lidar com matrizes vazias ou zero.
Você pode supor que os números inteiros não causem problemas de estouro.
Saída:
Um valor consistente para matrizes de classificação um e um valor consistente diferente para outras matrizes.
Built-ins:
Você não pode usar nenhum componente interno para calcular a classificação ou verificar diretamente a classificação um. Você pode usar outros recursos internos, como autovalores, decomposições, etc., mas eu encorajo respostas positivas que não têm recursos internos, que fazem a maior parte do trabalho.
Casos de teste:
Primeiro lugar:
[[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]]
Não no primeiro lugar:
[[-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]]
Entre os melhores:
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&
Respostas:
Gelatina , 6 bytes
Experimente online!
Como funciona
Precisão
Ær
usa métodos numéricos; portanto, seus resultados geralmente são inexatos. Por exemplo, a entrada [6, -5, 1] , que representa o polinômio 6 - 5x + x² , resulta nas raízes 3.0000000000000004 e 1.9999999999999998 . No entanto, multiplicar todos os coeficientes de um polinômio pela mesma constante diferente de zero resulta em raízes igualmente inexatas. Por exemplo,Ær
obtém as mesmas raízes para [6, -5, 1] e [6 × 10 100 , -5 × 10 100 , 10 100 ] .Note-se que a precisão limitada dos tipos float e complexo pode levar a erros. Por exemplo,
Ær
obteria as mesmas raízes para [1, 1] e [10 100 , 10 100 + 1] . Como podemos assumir que a matriz não é grande e não foi escolhida especificamente para ser classificada incorretamente , isso deve ser bom.fonte
Haskell , 50 bytes
r
pega uma lista de listas de seInteger
retornaFalse
se a matriz tiver uma classificação,True
caso contrário.Experimente online!
Como funciona
a
eb
(incluindo linhas iguais) e, para cada par, permitex
ey
percorre os elementos correspondentes.b
porx
e a linhaa
pory
. A matriz terá uma classificação se e somente se os resultados forem sempre iguais.<
pode ser usado para verificar se há alguma desigualdade. A lista de resultados do teste é combinada comor
, indicandoTrue
se existem linhas não proporcionais.fonte
Mathematica,
5133 bytesEntrada
-14 bytes do usuário202729 Mais
3 bytes salvos de junghwanmin
fonte
First@#
, você pode calcular,0First@#
pois 0 multiplica com tudo é 0 e a multiplicação é listável. Além disso, você pode considerar o usoTr[1^<list>]
para calcular o comprimento de uma lista.0#&@@#
,{0..}
também funcionaria. E entãoInfix
funciona, para que o código final possa serRowReduce@#~Count~{0..}==Tr[1^#]-1&
, economizando 2 bytes.Except
pode ser usado para se livrar deTr
coisas. -3 bytes:RowReduce@#~Count~Except@{0..}==1&
<2
pode ser usado em vez de==1
.JavaScript (ES6),
686765 bytesEste é baseado na resposta 05AB1E de Neil e é significativamente mais eficiente do que minha abordagem original.
Retorna
false
para a classificação um etrue
caso contrário.Casos de teste
Mostrar snippet de código
Resposta original, 84 bytes
Retorna
false
para a classificação um etrue
caso contrário.Casos de teste
Mostrar snippet de código
Quão?
A subtração que é executada no final do código pode levar a muitas situações diferentes, resumidas abaixo:
O teste falha, assim que receber um valor truthy: isto acontece quando nos deparamos com duas proporções diferentes (excepto 0/0 ) entre a (i, y) e um (i, r) em qualquer linha y da matriz, onde r é o índice de uma linha diferente de zero.
fonte
Python 2 + numpy, 58 bytes
Experimente online!
Crédito para isso .
fonte
1e-9
vez de1e-10
?Gelatina , 12 bytes
Experimente online!
Explicação
A explicação pode estar um pouco incorreta, pois esta é minha interpretação do golfe em milhas do meu algoritmo original
-5 bytes graças a milhas
fonte
ẸÐfµ÷"ЀZE€Ẹ
TIO05AB1E , 16 bytes
Experimente online! Usa a propriedade da tabela de multiplicação que os cantos opostos de qualquer retângulo têm o mesmo produto. Explicação:
fonte
TI-Basic (série TI-83),
282728 bytes (62 caracteres)Calcula a forma de escalão de linha da matriz
[A]
, armazena sua primeira linha (a ser descartada)L₁
e a segunda linha emᶫX
. Entãomax(abs(ᶫX
será zero seᶫX
consistir apenas de zeros, e um valor positivo caso contrário, quenot(
mudará para 1 se a matriz for classificada como um, 0 caso contrário.Para uma matriz de 1 linha,
ᶫX
é definido como{0}
e não é alterado quando tentamos examinar a segunda linha inexistente da matriz.-1 byte graças a Scott Milner
+1 byte para corrigir erro de dimensão para matrizes de 1 linha. Acontece que o
Matr►list(
comando reclama se você tentar extrair a segunda linha de uma matriz com apenas uma linha; no entanto, se você tentar extrair a primeira e a segunda linha da matriz, ela falhará silenciosamente.fonte
Prompt [A]
vez deAns→[A]
.ClrList
inicializarᶫX
, mas ainda não consegui que isso funcionasse em menos espaço.Matr►list(
ela substituirá a lista, mesmo que ela não exista, e você economizará 5 bytes.Braquilog , 27 bytes
Experimente online!
Usa a abordagem de Neil de "produtos de cantos opostos de cada retângulo devem ser iguais". O produto cruzado é caro e leva 10 bytes inteiros, mas ainda é mais curto do que qualquer abordagem baseada em divisão que tentei, principalmente por causa da estipulação de duas saídas consistentes para verdade e falsey na pergunta - fazer da falsey ser apenas um
false.
, e às vezes não um erro de divisão por zero, usa muitos bytes.Abordagem alternativa com base na divisão por elementos ( 30 bytes ):
Experimente online!
fonte
Geléia , 9 bytes
Experimente online!
fonte
SageMath, 40 bytes
Experimente online
Essa função anônima retornará
False
se a matriz estiver na primeira posição eTrue
caso contrário.A função pega uma matriz
M
como entrada, converte-a na forma de escalão de linha reduzida (M.rref()
) e testa seany
as linhas após a primeira são diferentes de zero. Então, esse valor é multiplicado porM.nrows()>1
(a matriz possui mais de uma linha?).fonte
Python 3 ,
9391 bytesExperimente online!
Como funciona
Verifica se algum menor de 2 tem determinante diferente de zero. Se for esse o caso, a classificação deve ser pelo menos 2: "Um menor menor que não desaparece (submatriz p × p com determinante diferente de zero) mostra que as linhas e colunas dessa submatriz são linearmente independentes e, portanto, essas linhas e as colunas da matriz completa são linearmente independentes (na matriz completa), portanto, a classificação de linha e coluna é pelo menos tão grande quanto a classificação determinante "(da Wikipedia )
Nota: raspou dois bytes graças ao comentário do usuário71546.
fonte
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
fornece uma base da imagem da transformação linear definida pela matriz.Experimente online!
fonte