O desafio é escrever codegolf para a permanente de uma matriz .
A permanente de uma matriz- n
by = ( ) é definida comon
A
a
i,j
Aqui S_n
representa o conjunto de todas as permutações de [1, n]
.
Como um exemplo (do wiki):
Seu código pode receber entrada da maneira que desejar e fornecer saída em qualquer formato razoável, mas inclua na sua resposta um exemplo completo, incluindo instruções claras de como fornecer entrada para o seu código. Para tornar o desafio um pouco mais interessante, a matriz pode incluir números complexos.
A matriz de entrada é sempre quadrada e terá no máximo 6 por 6. Você também precisará lidar com a matriz vazia que possui o 1. permanente. Não há necessidade de lidar com a matriz vazia (isso estava causando muitos problemas).
Exemplos
Entrada:
[[ 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 ]]
Resultado:
-1.7421952844303492+2.2476833142265793j
Entrada:
[[ 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]]
Resultado:
-1.972117936608412+1.6081325306004794j
Entrada:
[[ 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]]
Resultado:
-22.92354821347135-90.74278997288275j
Você não pode usar nenhuma função pré-existente para calcular a permanente.
[[]]
(possui uma linha, a matriz vazia não) ou[]
(não possui profundidade 2, matrizes possuem) em forma de lista?[[]]
.Respostas:
J, 5 bytes
J não oferece embutidos para o permanente ou determinante, mas oferece uma conjunção
u . v y
que se expande recursivamentey
ao longo dos menores e calcula diádicau . v
entre os cofatores e a saída da chamada recursiva aos menores. As opçõesu
ev
podem variar. Por exemplo, usandou =: -/
ev =: *
é-/ .*
qual é o determinante. As escolhas podem, mesmo por%/ .!
ondeu=: %/
, reduzir por divisão ev =: !
qual é o coeficiente binomial. Não sei ao certo o que essa saída significa, mas você pode escolher seus verbos.Uma implementação alternativa para 47 bytes usando o mesmo método na minha resposta do Mathematica .
Isso simula um polinômio com n variáveis, criando um polinômio com uma variável aumentada para potências de 2. Isso é mantido como uma lista de coeficientes e a multiplicação polinomial é realizada por convolução, e o índice em 2 n conterá o resultado.
Outra implementação para 31 bytes é
que é uma versão ligeiramente golfe, com base na expansão de Laplace, extraída do ensaio J sobre determinantes .
Uso
fonte
Haskell, 59 bytes
Isso faz um desenvolvimento semelhante ao Laplace ao longo da primeira coluna e usa que a ordem das linhas não importa. Funciona para qualquer tipo numérico.
A entrada é como lista de listas:
fonte
Geléia ,
109 bytesExperimente online!
Como funciona
fonte
Python 2, 75 bytes
Parece desajeitado ... deve ser superável.
fonte
05AB1E ,
191413 bytesExperimente online!
Explicação
fonte
œ€Å\PO
.Python 2, 139 bytes
repl.it
Implementa o algoritmo ingênuo que segue cegamente a definição.
fonte
MATL,
1714 bytesExperimente Online
Explicação
fonte
Rubi,
7463 bytesUma tradução direta da fórmula. Vários bytes salvos graças ao ezrast.
Explicação
fonte
reduce
realmente prejudica sua contagem de bytes em comparação à agregação manual:->a{m=0;a.permutation{|b|n=1;a.size.times{|i|n*=b[i][i]};m+=n};m}
times
circuito também.Ruby 2.4.0,
5961 bytesExpansão recursiva de Laplace:
Menos golfe:
O Ruby 2.4 não é lançado oficialmente. Nas versões anteriores,
.sum
será necessário substituir por.reduce(:+)
, adicionando 7 bytes.fonte
Mathematica, 54 bytes
Agora que as matrizes vazias não são mais consideradas, esta solução é válida. É originário da página MathWorld em permanentes .
fonte
JavaScript (ES6), 82 bytes
Também funciona com a matriz vazia, é claro.
fonte
Julia 0.4 , 73 bytes
Nas versões mais recentes do julia, você pode ignorar
[]
as compreensões, mas precisausing Combinatorics
dapermutations
função. Funciona com todos os tipos de números em Julia, incluindoComplex
.r
é umUnitRange
objeto definido como um argumento de função padrão, que pode depender de argumentos de função anteriores.Experimente online!
fonte