Le défi est d'écrire du codegolf pour le Hafnian d'une matrice . Le Hafnien d'une matrice 2n
-par- 2n
symétrique A
est défini comme:
Ici, S 2n représente l'ensemble de toutes les permutations des entiers de 1
à 2n
, c'est-à-dire [1, 2n]
.
Le lien wikipedia parle des matrices d'adjacence mais votre code devrait fonctionner pour toutes les matrices d'entrée symétriques à valeur réelle.
Pour ceux qui s'intéressent aux applications du Hafnian, le lien mathoverflow en discute plus.
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.
La matrice d'entrée est toujours carrée et sera au maximum de 16 sur 16. Il n'est pas nécessaire de pouvoir gérer la ou les matrices vides de dimension impaire.
Implémentation de référence
Voici un exemple de code python de M. Xcoder.
from itertools import permutations
from math import factorial
def hafnian(matrix):
my_sum = 0
n = len(matrix) // 2
for sigma in permutations(range(n*2)):
prod = 1
for j in range(n):
prod *= matrix[sigma[2*j]][sigma[2*j+1]]
my_sum += prod
return my_sum / (factorial(n) * 2 ** n)
print(hafnian([[0, 4.5], [4.5, 0]]))
4.5
print(hafnian([[0, 4.7, 4.6, 4.5], [4.7, 0, 2.1, 0.4], [4.6, 2.1, 0, 1.2], [4.5, 0.4, 1.2, 0]])
16.93
print(hafnian([[1.3, 4.1, 1.2, 0.0, 0.9, 4.4], [4.1, 4.2, 2.7, 1.2, 0.4, 1.7], [1.2, 2.7, 4.9, 4.7, 4.0, 3.7], [0.0, 1.2, 4.7, 2.2, 3.3, 1.8], [0.9, 0.4, 4.0, 3.3, 0.5, 4.4], [4.4, 1.7, 3.7, 1.8, 4.4, 3.2]])
262.458
La page wiki a maintenant (2 mars 2018) été mise à jour par ShreevatsaR pour inclure une manière différente de calculer le Hafnian. Il serait très intéressant de voir ce golf.
la source
Réponses:
R ,
150142127 127119 octetsEssayez-le en ligne!
Utilise la même astuce que j'ai découverte en descendant cette réponse pour indexer la matrice
P
, et @Vlo a suggéré une approche pour supprimer entièrement lafor
boucle pour -6 octets!Pour créer un nouveau scénario de test, vous pouvez le faire
matrix(c(values,separated,by,commas,going,across,rows),nrow=2n,ncol=2n,byrow=T)
.Explication: (le code est le même; il utilise une boucle
apply
plutôt qu'unefor
boucle mais la logique est par ailleurs identique).la source
N
etk
dans les arguments de fonction pour obtenir une instruction, en supprimant{}
et en enregistrant deux autres octets.Pyth , 24 octets
Essayez-le ici!
Ancienne version, 35 octets
Essayez-le ici!
la source
a[b]
suffit de rivaliser).xÍysè<¹sès·<ysè<è
genre lmao? PS Mine fait 40 octets et ne fonctionne pas si bien, alors n'hésitez pas à le poster, je ne suis pas sûr de pouvoir terminer avant de rentrer chez moi.Stax ,
23221917 octetsExécutez-le et déboguez-le en ligne
La représentation ascii correspondante du même programme est la suivante.
Le programme souffre d'une erreur d'arrondi en virgule flottante. En particulier, il rapporte
33673.5000000011
au lieu de33673.5
. Mais je pense que la précision est acceptable étant donné que ce programme fonctionne sur des valeurs à virgule flottante. C'est aussi très lent, prenant presque une minute pour les exemples d'entrées sur cette machine.la source
05AB1E , 21 octets
Essayez-le en ligne!
Ancienne version, 32 octets
Essayez-le en ligne!
Comment ça marche?
la source
èsè
, hah ... haha ... je suis ringard.Gelée , 19 octets
Essayez-le en ligne!
Version alternative, 15 octets, défi postdates
Jelly a finalement obtenu l'indexation des tableaux à n dimensions.
Essayez-le en ligne!
Comment ça marche
La version 19 octets fonctionne de manière similaire; il suffit de se mettre en œuvre
œị
.la source
C (gcc) ,
288285282293292272271 octetsif(...)...k=0...else...,j=0...
au golfif(k=j=0,...)...else...
- et en effectuant un décalage d'index.float
matrices.2*j+++1
au golfj-~j++
.int
déclaration de type de variable superflue et en n'utilisant pas de fonction factorielle, mais en calculant la valeur factorielle à l'aide d'une boucle for déjà existante.S=S/F/(1<<n);
au golfS/=F*(1<<n);
.Essayez-le en ligne!
Explication
Essayez-le en ligne!
Au cœur du programme se trouve le générateur de permutation suivant qui boucle
S_n
. Tous les calculs hafniens sont simplement construits dessus - et plus loin encore.Essayez-le en ligne!
la source
float
matrices.2*j+++1
est équivalent àj+j+++1
, ce qui est identique àj-(-j++-1)
, nous pouvons donc utiliser efficacement le complément au niveau du bit pour enregistrer un octet:j-~j++
( Essayez-le en ligne )R ,
8478 octetsEssayez-le en ligne!
Edit: Merci à Vlo pour -6 octets.
Il semble que tout le monde ici implémente l'algorithme de référence standard avec permutations, mais j'ai essayé de tirer parti des connaissances de la communauté acquises dans le défi associé , qui est essentiellement la même tâche ciblée pour le code le plus rapide au lieu du golf.
Il s'avère que pour un langage qui est bon pour trancher des matrices (comme R), l'algorithme récursif:
hafnian(m) = sum(m[i,j] * hafnian(m[-rows and columns at i,j])
est non seulement plus rapide, mais aussi assez golfique. Voici le code non golfé:la source
If
entre parenthèses, -4 pour utiliserF
comme variable initialisée, -1 pour attribuern
dans leif
. tio.run/##XU/LCsIwELz7FcFTVtOQl1pf1/…Gelée , 29 octets
Essayez-le en ligne!
Je pense que la
;@€€Wị@/€€P€
partie peut probablement être tournée vers le bas. Besoin de revenir plus tard pour vérifier et ajouter une explication.la source
J
) avant de jouer au golf . Les esprits gelés pensent de la même façon ? sourceLḶŒ!s€2ḅL‘ịFZµPS÷JḤ$P$
TIOHaskell , 136 octets
-14 octets grâce aux ovs.
Essayez-le en ligne!
Pouah...
la source
MATL ,
292422 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test: 1 , 2 , 3 .
Comment ça marche
la source
Wolfram Language (Mathematica) , 85 octets
Essayez-le en ligne!
la source
Noix de coco ,
165145128127 octets-1 octet merci à M. Xcoder
Essayez-le en ligne!
la source
Perl 6, 86 octets
la source