Учитывая матрицу целых чисел, проверьте, является ли она рангом один, означая, что каждая строка кратна одному и тому же вектору. Например, в
2 0 -20 10
-3 0 30 -15
0 0 0 0
каждая строка кратна 1 0 -10 5
.
Это же определение также работает со столбцами вместо строк. В качестве альтернативы, матрица занимает первое место, если она похожа на таблицу умножения:
* 1 0 -10 5
----------------
2 | 2 0 -20 10
-3 | -3 0 30 -15
0 | 0 0 0 0
Мы присвоили метки строк и меток r[i]
столбцов, c[j]
чтобы каждая запись матрицы M[i][j]
была произведением соответствующих меток как M[i][j] = r[i] * c[j]
.
Входные данные:
Целочисленная матрица как 2D контейнер на ваш выбор. Например, список списков, двумерный массив или аналогичный. Вы не должны принимать ширину или высоту в качестве дополнительных входных данных, если формат массива не требует этого.
Матрица может быть не квадратной. В ней будет хотя бы одна ненулевая запись - вам не нужно иметь дело с пустыми или нулевыми матрицами.
Вы можете предположить, что целые числа не вызовут проблем переполнения.
Выход:
Согласованное значение для матриц ранга один и другое согласованное значение для других матриц.
Встроенные модули:
Вы не можете использовать какие-либо встроенные средства для вычисления ранга или прямой проверки ранга один. Вы можете использовать другие встроенные модули, такие как собственные значения, декомпозиции и т. Д., Но я призываю отказаться от ответов, в которых встроенные модули не выполняют большую часть работы.
Тестовые случаи:
Ранг-один:
[[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]]
Не на первом месте
[[-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]]
Leaderboard:
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&
Ответы:
Желе , 6 байт
Попробуйте онлайн!
Как это устроено
точность
Ær
использует численные методы, поэтому его результаты обычно неточны. Например, вход [6, -5, 1] , представляющий полином 6 - 5x + x² , приводит к корням 3.0000000000000004 и 1.9999999999999998 . Однако умножение всех коэффициентов многочлена на одну и ту же ненулевую константу приводит к одинаково неточным корням. Например,Ær
получает одинаковые корни для [6, -5, 1] и [6 × 10 100 , -5 × 10 100 , 10 100 ] .Следует отметить, что ограниченная точность типов float и сложных типов может привести к ошибкам. Например,
Ær
получили бы одинаковые корни для [1, 1] и [10 100 , 10 100 + 1] . Поскольку мы можем предположить, что матрица невелика и специально не выбрана для неправильной классификации , это должно быть хорошо.источник
Haskell , 50 байтов
r
берет список списковInteger
s и возвращает,False
если матрица имеет ранг один, вTrue
противном случае.Попробуйте онлайн!
Как это устроено
a
иb
(включая равные строки), а для каждой пары позволяетx
иy
проходит через соответствующие элементы.b
наx
и строкуa
наy
. Матрица будет иметь ранг один в том и только в том случае, если результаты всегда равны.<
их можно использовать для проверки наличия неравенства. Список результатов теста объединяется сor
указаниемTrue
наличия непропорциональных строк.источник
Mathematica,
5133 байтавход
-14 байтов от user202729 Еще
3 байта сохранено от junghwanmin
источник
First@#
, вы можете вычислить,0First@#
так как 0 умножается на все, равное 0, а умножение является списочным. Также вы можете рассмотреть возможность использованияTr[1^<list>]
для расчета длины списка.0#&@@#
,{0..}
чтобы работать тоже. И тогдаInfix
работает, так что окончательный код может бытьRowReduce@#~Count~{0..}==Tr[1^#]-1&
, сохраняя 2 байта.Except
могут быть использованы, чтобы избавиться отTr
вещей. -3 байта:RowReduce@#~Count~Except@{0..}==1&
<2
его можно использовать вместо==1
.JavaScript (ES6),
686765 байтЭтот основан на ответе Нейла 05AB1E и значительно более эффективен, чем мой первоначальный подход.
Возвращает
false
за первое место и вtrue
противном случае.Контрольные примеры
Показать фрагмент кода
Оригинальный ответ, 84 байта
Возвращает
false
за первое место и вtrue
противном случае.Контрольные примеры
Показать фрагмент кода
Как?
Вычитание, которое выполняется в конце кода, может привести к множеству различных ситуаций, которые приведены ниже:
Тест не пройден , как только мы получим значение truthy: это происходит , когда мы сталкиваемся два различных коэффициентов (кроме 0/0 ) между а (х, у) и а (I, R) в любой строке у матрицы, где r - индекс ненулевой строки.
источник
Python 2 + NumPy, 58 байт
Попробуйте онлайн!
Кредит на это .
источник
1e-9
вместо1e-10
?Желе , 12 байт
Попробуйте онлайн!
объяснение
Объяснение может быть немного неверным, так как это моя интерпретация мили миль моего первоначального алгоритма
-5 байт благодаря милям
источник
ẸÐfµ÷"ЀZE€Ẹ
TIO05AB1E , 16 байтов
Попробуйте онлайн! Использует свойство таблицы умножения о том, что противоположные углы любого прямоугольника имеют одинаковое произведение. Объяснение:
источник
TI-Basic (серия TI-83),
282728 байтов (62 символа)Вычисляет форму строки в эшелоне матрицы
[A]
, сохраняет ее первую строку (подлежащую отбрасыванию) в,L₁
а вторую - вᶫX
. Тогдаmax(abs(ᶫX
будет ноль, еслиᶫX
состоит только из нулей, и положительное значение в противном случае, котороеnot(
изменится на 1, если матрица имеет ранг один, в противном случае - на 0.Для матрицы с 1 строкой
ᶫX
устанавливается{0}
и затем не изменяется, когда мы пытаемся посмотреть на несуществующую вторую строку матрицы.-1 байт благодаря Скотту Милнеру
+1 байт, чтобы исправить ошибку измерения для 1-рядных матриц. Оказывается,
Matr►list(
команда жалуется, если вы пытаетесь извлечь вторую строку из матрицы только с одной строкой; однако, если вы попытаетесь извлечь первую и вторую строки из матрицы, произойдет молчание.источник
Prompt [A]
вместоAns→[A]
.ClrList
инициализацииᶫX
, но я не совсем понял, чтобы работать в меньшем пространстве.Matr►list(
список будет перезаписан, даже если он не существует, и вы сэкономите 5 байтов.Брахилог , 27 байт
Попробуйте онлайн!
Использует подход Нейла «произведения противоположных углов каждого прямоугольника должны быть равны». Совокупный продукт является дорогостоящим и занимает 10 целых байтов, но это все же короче, чем любой подход, основанный на делении, который я пробовал, в основном из-за наличия в вопросе двух последовательных выходных данных для правдивого и фальшивого - сделать фальси только
false.
, а не иногда ошибка деления на ноль, использует слишком много байтов.Альтернативный подход, основанный на поэлементном делении ( 30 байтов ):
Попробуйте онлайн!
источник
Желе , 9 байт
Попробуйте онлайн!
источник
SageMath, 40 байт
Попробуйте онлайн
Эта анонимная функция возвращает,
False
если матрица ранга один, иTrue
противном случае.Функция принимает матрицу в
M
качестве входных данных, преобразует ее в сокращенную форму row-echelon (M.rref()
) и проверяет, чтобыany
строки после первой строки были ненулевыми. Затем это значение умножается наM.nrows()>1
(матрица имеет более одной строки?).источник
Python 3 ,
9391 байтПопробуйте онлайн!
Как это устроено
Проверяет, имеет ли какой-либо 2-минорный ненулевой определитель. В этом случае ранг должен быть не менее 2: «неисчезающий p-минор (подматрица p × p с ненулевым определителем) показывает, что строки и столбцы этой подматрицы линейно независимы, и, следовательно, эти строки и столбцы полной матрицы линейно независимы (в полной матрице), поэтому ранг строки и столбца, по крайней мере, так же велик, как и детерминантный ранг "(из Википедии )
Примечание: побрили два байта благодаря комментарию user71546.
источник
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))
Пари / ГП , 18 байт
matimage
дает основу изображения линейного преобразования, определяемого матрицей.Попробуйте онлайн!
источник