El desafío es escribir codegolf para el permanente de una matriz .
El permanente de una matriz n
-by- = ( ) se define comon
A
a
i,j
Aquí S_n
representa el conjunto de todas las permutaciones de [1, n]
.
Como ejemplo (de la wiki):
Su código puede recibir información como lo desee y proporcionar resultados en cualquier formato razonable, pero incluya en su respuesta un ejemplo completo que incluya instrucciones claras sobre cómo proporcionar información a su código. Para hacer el desafío un poco más interesante, la matriz puede incluir números complejos.
La matriz de entrada siempre es cuadrada y será como máximo de 6 por 6. También deberá poder manejar la matriz vacía que tiene permanente 1. No es necesario poder manejar la matriz vacía (estaba causando demasiados problemas).
Ejemplos
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 ]]
Salida:
-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]]
Salida:
-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]]
Salida:
-22.92354821347135-90.74278997288275j
No puede utilizar ninguna función preexistente para calcular el permanente.
[[]]
(tiene una fila, la matriz vacía no) o[]
(no tiene profundidad 2, las matrices sí) en forma de lista?[[]]
.Respuestas:
J, 5 bytes
J no ofrece incorporaciones para lo permanente o determinante, sino que ofrece una conjunción
u . v y
que se expande recursivamente a loy
largo de los menores y calcula diádicau . v
entre los cofactores y la salida de la llamada recursiva a los menores. Las opciones deu
yv
pueden variar. Por ejemplo, usaru =: -/
yv =: *
es-/ .*
cuál es el determinante. Las opciones pueden incluso por%/ .!
dóndeu=: %/
, reducir por división, yv =: !
cuál es el coeficiente binomial. No estoy seguro de lo que significa esa salida, pero eres libre de elegir tus verbos.Una implementación alternativa para 47 bytes usando el mismo método en mi respuesta de Mathematica .
Esto simula un polinomio con n variables creando un polinomio con una variable elevada a potencias de 2. Esto se mantiene como una lista de coeficientes y la multiplicación polinomial se realiza usando convolución, y el índice en 2 n contendrá el resultado.
Otra implementación para 31 bytes es
que es una versión ligeramente golfizada basada en la expansión de Laplace tomada del ensayo J sobre determinantes .
Uso
fuente
Haskell, 59 bytes
Esto hace un desarrollo similar a Laplace a lo largo de la primera columna, y usa que el orden de las filas no importa. Funciona para cualquier tipo numérico.
La entrada es como una lista de listas:
fuente
Jalea ,
109 bytesPruébalo en línea!
Cómo funciona
fuente
Python 2, 75 bytes
Parece torpe ... debería ser vencible.
fuente
05AB1E ,
191413 bytesPruébalo en línea!
Explicación
fuente
œ€Å\PO
.Python 2, 139 bytes
repl.it
Implementa el algoritmo ingenuo que sigue ciegamente la definición.
fuente
MATL,
1714 bytesPruébalo en línea
Explicación
fuente
Rubí,
7463 bytesUna traducción directa de la fórmula. Varios bytes guardados gracias a ezrast.
Explicación
fuente
reduce
en realidad daña el recuento de bytes en comparación con la agregación manual:->a{m=0;a.permutation{|b|n=1;a.size.times{|i|n*=b[i][i]};m+=n};m}
times
circuito también.Ruby 2.4.0,
5961 bytesExpansión recursiva de Laplace:
Menos golfizado:
Ruby 2.4 no se lanza oficialmente. En versiones anteriores,
.sum
deberá ser reemplazado por.reduce(:+)
, agregando 7 bytes.fuente
Mathematica, 54 bytes
Ahora que las matrices vacías ya no se consideran, esta solución es válida. Se origina en la página MathWorld sobre permanentes .
fuente
JavaScript (ES6), 82 bytes
También funciona con la matriz vacía, por supuesto.
fuente
Julia 0.4 , 73 bytes
En las versiones más recientes de julia, puede omitir
[]
las comprensiones, pero necesitausing Combinatorics
lapermutations
función. Funciona con todos los tipos de números en Julia, incluidosComplex
.r
es unUnitRange
objeto definido como un argumento de función predeterminado, que puede depender de argumentos de función anteriores.Pruébalo en línea!
fuente