Le défi est d'écrire du codegolf pour le permanent d'une matrice .
Le permanent d'une matrice n
-by- = ( ) est défini commen
A
a
i,j
S_n
Représente ici l'ensemble de toutes les permutations de [1, n]
.
À titre d'exemple (du wiki):
Votre code peut prendre une entrée comme il le souhaite et donner une sortie dans n'importe quel format raisonnable, mais veuillez inclure dans votre réponse un exemple complet comprenant des instructions claires sur la façon de fournir une entrée à votre code. Pour rendre le défi un peu plus intéressant, la matrice peut inclure des nombres complexes.
La matrice d'entrée est toujours carrée et sera au maximum de 6 par 6. Vous devrez également être capable de gérer la matrice vide qui a un permanent 1. Il n'est pas nécessaire de pouvoir gérer la matrice vide (cela causait trop problèmes).
Exemples
Contribution:
[[ 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 ]]
Production:
-1.7421952844303492+2.2476833142265793j
Contribution:
[[ 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]]
Production:
-1.972117936608412+1.6081325306004794j
Contribution:
[[ 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]]
Production:
-22.92354821347135-90.74278997288275j
Vous ne pouvez pas utiliser de fonctions préexistantes pour calculer le permanent.
[[]]
(a une ligne, pas la matrice vide) ou[]
(n'a pas la profondeur 2, les matrices le font) sous forme de liste?[[]]
.Réponses:
J, 5 octets
J n'offre pas de builtins pour le permanent ou le déterminant mais propose plutôt une conjonction
u . v y
qui se développe récursivement ley
long des mineurs et calcule dyadiqueu . v
entre les cofacteurs et la sortie de l'appel récursif sur les mineurs. Les choix deu
etv
peuvent varier. Par exemple, en utilisantu =: -/
etv =: *
est-/ .*
qui est le déterminant. Les choix peuvent même par%/ .!
oùu=: %/
, réduire par division etv =: !
quel est le coefficient binomial. Je ne sais pas ce que signifie cette sortie, mais vous êtes libre de choisir vos verbes.Une implémentation alternative pour 47 octets utilisant la même méthode dans ma réponse Mathematica .
Cela simule un polynôme avec n variables en créant un polynôme avec une variable élevée à des puissances de 2. Ceci est tenu comme une liste de coefficients et la multiplication polynomiale est effectuée en utilisant la convolution, et l'indice à 2 n contiendra le résultat.
Une autre implémentation pour 31 octets est
qui est une version légèrement golfée basée sur l'expansion de Laplace tirée de l'essai J sur les déterminants .
Usage
la source
Haskell, 59 octets
Cela fait un développement semblable à Laplace le long de la première colonne, et utilise que l'ordre des lignes n'a pas d'importance. Cela fonctionne pour n'importe quel type numérique.
L'entrée est comme une liste de listes:
la source
Gelée ,
109 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Python 2, 75 octets
Semble maladroit ... devrait être battable.
la source
05AB1E ,
191413 octetsEssayez-le en ligne!
Explication
la source
œ€Å\PO
.Python 2, 139 octets
repl.it
Implémente l'algorithme naïf qui suit aveuglément la définition.
la source
MATL,
1714 octetsEssayez-le en ligne
Explication
la source
Rubis,
7463 octetsUne traduction simple de la formule. Plusieurs octets enregistrés grâce à ezrast.
Explication
la source
reduce
blesse réellement votre nombre d'octets par rapport à l'agrégation manuelle:->a{m=0;a.permutation{|b|n=1;a.size.times{|i|n*=b[i][i]};m+=n};m}
times
boucle.Ruby 2.4.0,
5961 octetsExpansion récursive de Laplace:
Moins golfé:
Ruby 2.4 n'est pas officiellement publié. Sur les versions antérieures,
.sum
devra être remplacé par.reduce(:+)
, en ajoutant 7 octets.la source
Mathematica, 54 octets
Maintenant que les matrices vides ne sont plus prises en compte, cette solution est valable. Il provient de la page MathWorld sur les permanents .
la source
JavaScript (ES6), 82 octets
Fonctionne également avec la matrice vide.
la source
Julia 0.4 , 73 octets
Dans les versions plus récentes de julia, vous pouvez supprimer
[]
les compréhensions, mais vous avez besoinusing Combinatorics
de lapermutations
fonction. Fonctionne avec tous les types de nombres dans Julia, y comprisComplex
.r
est unUnitRange
objet défini comme argument de fonction par défaut, qui peut dépendre des arguments de fonction précédents.Essayez-le en ligne!
la source