Die Herausforderung besteht darin, Codegolf für das Permanent einer Matrix zu schreiben .
Die Permanenz einer n
-by- n
Matrix A
= ( a
i,j
) ist definiert als
Hier wird S_n
die Menge aller Permutationen von dargestellt [1, n]
.
Als Beispiel (aus dem Wiki):
Ihr Code kann Eingaben vornehmen, 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. Um die Herausforderung ein wenig interessanter zu gestalten, kann die Matrix komplexe Zahlen enthalten.
Die Eingabematrix ist immer quadratisch und wird höchstens 6 mal 6 sein. Sie müssen auch in der Lage sein, mit der leeren Matrix mit permanenter 1 umzugehen. Es ist nicht erforderlich, mit der leeren Matrix umzugehen (sie hat zu viele verursacht) Probleme).
Beispiele
Eingang:
[[ 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 ]]
Ausgabe:
-1.7421952844303492+2.2476833142265793j
Eingang:
[[ 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]]
Ausgabe:
-1.972117936608412+1.6081325306004794j
Eingang:
[[ 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]]
Ausgabe:
-22.92354821347135-90.74278997288275j
Sie dürfen keine bereits vorhandenen Funktionen verwenden, um die bleibende Karte zu berechnen.
[[]]
(hat eine Zeile, die leere Matrix nicht) oder[]
(hat keine Tiefe 2, Matrizen) in Listenform?[[]]
.Antworten:
J, 5 Bytes
J bietet keine Builtins für die Permanente oder Determinante an, sondern eine Konjunktion,
u . v y
die sich rekursivy
entlang der Minderjährigen ausdehnt und die dyadische Beziehungu . v
zwischen den Cofaktoren und der Ausgabe des rekursiven Aufrufs an die Minderjährigen berechnet . Die Auswahlmöglichkeiten vonu
undv
können variieren. Zum Beispiel mitu =: -/
undv =: *
ist-/ .*
das, was die Determinante ist. Entscheidungen können sogar durch%/ .!
wou=: %/
, durch Division, undv =: !
was ist Binomialkoeffizient zu reduzieren . Ich bin nicht sicher, was diese Ausgabe bedeutet, aber Sie können Ihre Verben frei wählen.Eine alternative Implementierung für 47 Bytes unter Verwendung derselben Methode in meiner Mathematica- Antwort .
Dies simuliert ein Polynom mit n Variablen, indem ein Polynom mit einer auf Potenzen von 2 angehobenen Variablen erstellt wird. Dies wird als Koeffizientenliste gehalten, und die Polynommultiplikation wird unter Verwendung der Faltung durchgeführt, und der Index bei 2 n enthält das Ergebnis.
Eine andere Implementierung für 31 Bytes ist
Dies ist eine leicht golfene Version, die auf der Laplace-Erweiterung basiert, die dem J-Aufsatz über Determinanten entnommen ist .
Verwendung
quelle
Haskell, 59 Bytes
Dies führt eine Laplace-ähnliche Entwicklung entlang der ersten Spalte durch und verwendet, dass die Reihenfolge der Zeilen keine Rolle spielt. Es funktioniert für jeden numerischen Typ.
Die Eingabe erfolgt als Liste von Listen:
quelle
Gelee ,
109 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Python 2, 75 Bytes
Scheint klobig ... sollte schlagbar sein.
quelle
05AB1E ,
191413 BytesProbieren Sie es online!
Erläuterung
quelle
œ€Å\PO
.Python 2, 139 Bytes
repl.it
Implementiert den naiven Algorithmus, der der Definition blind folgt.
quelle
MATL,
1714 BytesProbieren Sie es online
Erläuterung
quelle
Rubin,
7463 BytesEine einfache Übersetzung der Formel. Dank ezrast werden mehrere Bytes eingespart.
Erläuterung
quelle
reduce
->a{m=0;a.permutation{|b|n=1;a.size.times{|i|n*=b[i][i]};m+=n};m}
times
golfen.Mathematica, 54 Bytes
Diese Lösung ist gültig, da die leeren Matrizen nicht mehr berücksichtigt werden. Es stammt von der MathWorld-Seite zu permanenten Objekten .
quelle
Ruby 2.4.0,
5961 BytesRekursive Laplace-Erweiterung:
Weniger golfen:
Ruby 2.4 ist nicht offiziell freigegeben. In früheren Versionen
.sum
muss durch ersetzt werden.reduce(:+)
, wobei 7 Byte hinzugefügt werden.quelle
JavaScript (ES6), 82 Byte
Funktioniert natürlich auch mit der leeren Matrix.
quelle
Julia 0,4 , 73 Bytes
In neueren julia-versionen kann man das
[]
um die verständnisse fallen lassen, braucht aberusing Combinatorics
diepermutations
funktion. Funktioniert mit allen Nummerntypen in Julia, einschließlichComplex
.r
ist einUnitRange
Objekt, das als Standardfunktionsargument definiert ist und von vorherigen Funktionsargumenten abhängen kann.Probieren Sie es online!
quelle