Задача состоит в том, чтобы написать codegolf для перманента матрицы .
Перманент n
-by- n
matrix A
= ( a
i,j
) определяется как
Здесь S_n
представляет множество всех перестановок [1, n]
.
Как пример (из вики):
Ваш код может принимать любые входные данные и выводить их в любом разумном формате, но, пожалуйста, включите в свой ответ полный проработанный пример, включая четкие инструкции о том, как вводить данные в ваш код. Чтобы сделать задачу немного более интересной, матрица может включать комплексные числа.
Входная матрица всегда квадратная и будет не более 6 на 6. Вам также нужно будет иметь возможность обрабатывать пустую матрицу, которая имеет перманент 1. Нет необходимости иметь возможность обрабатывать пустую матрицу (она вызывала слишком много проблемы).
Примеры
Входные данные:
[[ 0.36697048+0.02459455j, 0.81148991+0.75269667j, 0.62568185+0.95950937j],
[ 0.67985923+0.11419187j, 0.50131790+0.13067928j, 0.10330161+0.83532727j],
[ 0.71085747+0.86199765j, 0.68902048+0.50886302j, 0.52729463+0.5974208j ]]
Выход:
-1.7421952844303492+2.2476833142265793j
Входные данные:
[[ 0.83702504+0.05801749j, 0.03912260+0.25027115j, 0.95507961+0.59109069j],
[ 0.07330546+0.8569899j , 0.47845015+0.45077079j, 0.80317410+0.5820795j ],
[ 0.38306447+0.76444045j, 0.54067092+0.90206306j, 0.40001631+0.43832931j]]
Выход:
-1.972117936608412+1.6081325306004794j
Входные данные:
[[ 0.61164611+0.42958732j, 0.69306292+0.94856925j,
0.43860930+0.04104116j, 0.92232338+0.32857505j,
0.40964318+0.59225476j, 0.69109847+0.32620144j],
[ 0.57851263+0.69458731j, 0.21746623+0.38778693j,
0.83334638+0.25805241j, 0.64855830+0.36137045j,
0.65890840+0.06557287j, 0.25411493+0.37812483j],
[ 0.11114704+0.44631335j, 0.32068031+0.52023283j,
0.43360984+0.87037973j, 0.42752697+0.75343656j,
0.23848512+0.96334466j, 0.28165516+0.13257001j],
[ 0.66386467+0.21002292j, 0.11781236+0.00967473j,
0.75491373+0.44880959j, 0.66749636+0.90076845j,
0.00939420+0.06484633j, 0.21316223+0.4538433j ],
[ 0.40175631+0.89340763j, 0.26849809+0.82500173j,
0.84124107+0.23030393j, 0.62689175+0.61870543j,
0.92430209+0.11914288j, 0.90655023+0.63096257j],
[ 0.85830178+0.16441943j, 0.91144755+0.49943801j,
0.51010550+0.60590678j, 0.51439995+0.37354955j,
0.79986742+0.87723514j, 0.43231194+0.54571625j]]
Выход:
-22.92354821347135-90.74278997288275j
Вы не можете использовать какие-либо ранее существующие функции для вычисления перманента.
[[]]
(имеет одну строку, пустая матрица отсутствует) или[]
(не имеет глубины 2, матрицы имеют) в форме списка?[[]]
.Ответы:
J, 5 байт
J не предлагает встроенные функции для перманента или определителя, но вместо этого предлагает конъюнкцию,
u . v y
которая рекурсивно расширяетсяy
по младшим и вычисляет двоичное числоu . v
между кофакторами и выходными данными рекурсивного вызова для младших. Выбор изu
иv
может варьироваться. Например, при использовании ,u =: -/
иv =: *
это ,-/ .*
который является определяющим фактором . Выбор может даже%/ .!
гдеu=: %/
, уменьшиться на деление, иv =: !
который является биномиальным коэффициентом. Я не уверен, что означает этот вывод, но вы можете выбирать свои глаголы.Альтернативная реализация для 47 байтов, использующая тот же метод в моем ответе Mathematica .
Это моделирует многочлен с n переменными, создавая многочлен с одной переменной, возведенной в степени 2. Это сохраняется как список коэффициентов, и умножение полиномов выполняется с использованием свертки, и индекс в 2 n будет содержать результат.
Другая реализация на 31 байт является
которая является слегка гольфовой версией, основанной на расширении Лапласа, взятом из эссе о детерминантах .
использование
источник
Haskell, 59 байт
Это делает подобную Лапласу разработку вдоль первого столбца и использует то, что порядок строк не имеет значения. Это работает для любого числового типа.
Ввод в виде списка списков:
источник
Желе ,
109 байтПопробуйте онлайн!
Как это устроено
источник
Python 2, 75 байт
Кажется неуклюжим ... должно быть побиваемо.
источник
05AB1E ,
191413 байтПопробуйте онлайн!
объяснение
источник
œ€Å\PO
.Python 2, 139 байт
repl.it
Реализует наивный алгоритм, который слепо следует определению.
источник
MATL,
1714 байтовПопробуйте онлайн
объяснение
источник
Рубин,
7463 байтаПростой перевод формулы. Несколько байтов сохранено благодаря ezrast.
объяснение
источник
reduce
на самом деле вредит вашему счету байтов по сравнению с агрегацией вручную:->a{m=0;a.permutation{|b|n=1;a.size.times{|i|n*=b[i][i]};m+=n};m}
times
.Ruby 2.4.0,
5961 байтРекурсивное расширение Лапласа:
Менее гольф:
Ruby 2.4 официально не выпущен. В более ранних версиях их
.sum
нужно будет заменить.reduce(:+)
, добавив 7 байтов.источник
Mathematica, 54 байта
Теперь, когда пустые матрицы больше не рассматриваются, это решение является действительным. Это происходит от страницы MathWorld по перманентам .
источник
JavaScript (ES6), 82 байта
Конечно, работает и с пустой матрицей.
источник
Юлия 0,4 , 73 байта
В более новых версиях julia вы можете отказаться
[]
от понимания, но нужноusing Combinatorics
дляpermutations
функции. Работает со всеми типами номеров в Юлии, в том числеComplex
.r
являетсяUnitRange
объектом, определенным как аргумент функции по умолчанию, который может зависеть от предыдущих аргументов функции.Попробуйте онлайн!
источник