Die Herausforderung besteht darin, Codegolf für den Hafnianer einer Matrix zu schreiben . Der Hafnian einer 2n
-by- 2n
symmetrischen Matrix A
ist definiert als:
Hier repräsentiert S 2n die Menge aller Permutationen der ganzen Zahlen von 1
bis 2n
, das heißt [1, 2n]
.
Der Wikipedia-Link behandelt Adjazenzmatrizen, aber Ihr Code sollte für alle wirklich bewerteten symmetrischen Eingabematrizen funktionieren.
Für diejenigen, die an Anwendungen des Hafnian interessiert sind, werden im Mathoverflow- Link einige weitere Themen behandelt.
Ihr Code kann Eingaben annehmen, wie er möchte, und Ausgaben in jedem vernünftigen Format geben. Bitte fügen Sie Ihrer Antwort ein vollständiges Beispiel bei, das klare Anweisungen zur Eingabe Ihres Codes enthält.
Die Eingabematrix ist immer quadratisch und wird höchstens 16 mal 16 sein. Es ist nicht erforderlich, die leere Matrix oder Matrizen mit ungerader Dimension zu verarbeiten.
Referenzimplementierung
Hier ist ein Beispiel für Python-Code von Mr. 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
Die Wiki-Seite wurde jetzt (2. März 2018) von ShreevatsaR aktualisiert und enthält nun eine andere Methode zur Berechnung des Hafnian. Es wäre sehr interessant, dieses Golfspiel zu sehen.
quelle
Antworten:
R ,
150142127119 BytesProbieren Sie es online!
Benutzt den gleichen Trick, den ich entdeckt habe, als ich diese Antwort abgetastet habe , um die Matrix zu indizieren
P
, und @Vlo schlug einen Ansatz vor, um diefor
Schleife für -6 Bytes vollständig zu entfernen !Sie können einen neuen Testfall erstellen
matrix(c(values,separated,by,commas,going,across,rows),nrow=2n,ncol=2n,byrow=T)
.Erläuterung: (Der Code ist derselbe. Er verwendet
apply
eher eine als einefor
Schleife, aber die Logik ist ansonsten identisch.)quelle
N
undk
in Funktionsargumente verschieben, um es zu einer Anweisung zu bringen, die entfernt{}
und weitere zwei Bytes gespeichert werden.Pyth , 24 Bytes
Probieren Sie es hier aus!
Alte Version, 35 Bytes
Probieren Sie es hier aus!
quelle
a[b]
es ausreicht, um sich zu messen).xÍysè<¹sès·<ysè<è
Lmao? PS Meins ist 40 Bytes und funktioniert nicht so gut, hah, also zögern Sie nicht, es zu posten. Ich bin nicht sicher, ob ich fertig sein kann, bevor ich nach Hause muss.Stax ,
23221917 BytesFühren Sie es online aus und debuggen Sie es
Dies ist die entsprechende ASCII-Darstellung desselben Programms.
Das Programm leidet unter einem Gleitkomma-Rundungsfehler. Insbesondere berichtet es
33673.5000000011
statt33673.5
. Aber ich denke, die Genauigkeit ist akzeptabel, da dieses Programm mit Gleitkommawerten arbeitet. Es ist auch sehr langsam und dauert für die Beispieleingaben auf diesem Computer fast eine Minute.quelle
05AB1E , 21 Bytes
Probieren Sie es online!
Alte Version, 32 Bytes
Probieren Sie es online!
Wie es funktioniert?
quelle
èsè
, hah ... haha ... ich bin punny.Jelly , 19 Bytes
Probieren Sie es online!
Alternative Version, 15 Byte, Herausforderung nach Datum
Jelly hat endlich eine n-dimensionale Array-Indizierung erhalten.
Probieren Sie es online!
Wie es funktioniert
Die 19-Byte-Version funktioniert ähnlich. es muss sich nur selbst implementieren
œị
.quelle
C (gcc) ,
288285282293292272271 Bytesif(...)...k=0...else...,j=0...
aufif(k=j=0,...)...else...
- und eine Indexverschiebung durchgeführt.float
Matrizen.2*j+++1
zuj-~j++
.int
Variablentypdeklaration und Verzicht auf eine Fakultätsfunktion, sondern Berechnung des Fakultätswerts mithilfe einer bereits vorhandenen for-Schleife.S=S/F/(1<<n);
auf gespeichertS/=F*(1<<n);
.Probieren Sie es online!
Erläuterung
Probieren Sie es online!
Kern des Programms ist der folgende Permutationsgenerator, der durchschleift
S_n
. Alle hafnianischen Berechnungen bauen einfach darauf auf - und werden weiterentwickelt.Probieren Sie es online!
quelle
float
Matrizen.2*j+++1
ist gleichbedeutend mitj+j+++1
, was gleichbedeutend istj-(-j++-1)
, damit wir das bitweise Komplement effizient zum Speichern eines Bytes verwenden können:j-~j++
( Versuchen Sie es online )R ,
8478 BytesProbieren Sie es online!
Edit: Danke an Vlo für -6 Bytes.
Es scheint, dass jeder hier den Standardreferenzalgorithmus mit Permutationen implementiert, aber ich habe versucht, das Community-Wissen zu nutzen, das bei der damit verbundenen Herausforderung gewonnen wurde. Diese Aufgabe zielt im Grunde auf den schnellsten Code ab, anstatt auf Golf.
Es stellt sich heraus, dass der rekursive Algorithmus für eine Sprache, die sich gut zum Schneiden von Matrizen (wie R)
hafnian(m) = sum(m[i,j] * hafnian(m[-rows and columns at i,j])
eignet, nicht nur schneller ist, sondern auch ziemlich golfen kann. Hier ist der ungolfed Code:quelle
If
in Klammern, -4 für die VerwendungF
als initialisierte Variable, -1 für die Zuweisungn
innerhalb derif
. tio.run/##XU/LCsIwELz7FcFTVtOQl1pf1/…Gelee , 29 Bytes
Probieren Sie es online!
Ich denke, das
;@€€Wị@/€€P€
Teil kann wahrscheinlich abgespielt werden. Müssen später zurückkommen, um zu überprüfen und eine Erklärung hinzuzufügen.quelle
J
) bevor Sie Golf spielen . Jelly Minds denken gleich ? sourceLḶŒ!s€2ḅL‘ịFZµPS÷JḤ$P$
TIOHaskell , 136 Bytes
-14 bytes dank ovs.
Probieren Sie es online!
Pfui...
quelle
MATL ,
292422 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle: 1 , 2 , 3 .
Wie es funktioniert
quelle
Wolfram Language (Mathematica) , 85 Byte
Probieren Sie es online!
quelle
Kokosnuss ,
165145128127 Bytes-1 Byte danke an Herrn Xcoder
Probieren Sie es online!
quelle
Perl 6, 86 Bytes
quelle