Bei einem gegebenen Vektor von n
Werten (x1,x2,x3,...,xn)
zurückkehren , die Determinante der entsprechenden Vandermonde-Matrix .
Diese Determinante kann wie folgt geschrieben werden:
Einzelheiten
Ihr Programm / Ihre Funktion muss eine Liste von Gleitkommazahlen in einem beliebigen geeigneten Format akzeptieren, das eine variable Länge zulässt, und die angegebene Determinante ausgeben.
Sie können davon ausgehen, dass sowohl die Eingabe als auch die Ausgabe im Bereich der von Ihrer Sprache unterstützten Werte liegt. Wenn Ihre Sprache keine Gleitkommazahlen unterstützt, können Sie ganze Zahlen annehmen.
Einige Testfälle
Es ist zu beachten, dass die Determinante immer dann ist, wenn zwei gleiche Einträge 0
vorhanden sind , da in der entsprechenden Vandermonde-Matrix zwei gleiche Zeilen vorhanden sind. Vielen Dank an @randomra für den Hinweis auf diesen fehlenden Testfall.
[1,2,2,3] 0
[-13513] 1
[1,2] 1
[2,1] -1
[1,2,3] 2
[3,2,1] -2
[1,2,3,4] 12
[1,2,3,4,5] 288
[1,2,4] 6
[1,2,4,8] 1008
[1,2,4,8,16] 20321280
[0, .1, .2,...,1] 6.6586e-028
[1, .5, .25, .125] 0.00384521
[.25, .5, 1, 2, 4] 19.3798828
quelle
[1,2,2,3] => 0
Zwei gleiche Elemente im Array, um zu testen, ob der Code die Selbstdifferenz (xi-xi
) überprüft, indem er nur mit verglichen wird0
.Antworten:
Gelee, 6 Bytes
œc2
Ruft alle Kombinationen ab, ohne die Länge 2 zu ersetzen.I
Berechnet die Differenzliste jedes dieser Paare und ergibt eine Liste wie[[1], [2], [3], ..., [1]]
. WirF
latten und nehmen dasP
Produkt.Probieren Sie es hier aus!
quelle
Ruby,
4947 BytesDies ist eine Lambda-Funktion, die ein eindimensionales Array mit einem reellen Wert akzeptiert und je nach Art der Eingabe einen Gleitkommawert oder eine Ganzzahl zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu
f.call(input)
.Wir erhalten alle Kombinationen der Größe 2 mit
.combination(2)
und erhalten die Unterschiede für jedes Paar mit.map {|a, b| b - a}
. Wir verbinden das resultierende Array in eine Zeichenfolge getrennt durch*
, danneval
dieses, das das Produkt zurück. Wenn die Eingabe die Länge 1 hat, ist diesnil
, was in Ruby falsch ist, so dass wir||1
in dieser Situation gerade am Ende 1 zurückgeben können. Beachten Sie, dass dies immer noch funktioniert, wenn das Produkt 0 ist, da 0 in Ruby aus irgendeinem Grund wahr ist.Überprüfen Sie alle Testfälle online
2 Bytes gespart dank Doorknob!
quelle
Mathematica, 30 Bytes
Dies ist eine anonyme Funktion.
Erweitert um Mathematica ist es äquivalent zu
(1 ##1 & ) @@ Apply[#2 - #1 & , Subsets[#1, {2}], {1}] &
.1##&
ist eine Entsprechung fürTimes
(Dankesseite), die auf jedes einzelne Elementpaar aus der von generierten Eingabeliste angewendet wirdSubsets[list, {2}]
. Beachten Sie, dassSubsets
die Eindeutigkeit von Elementen nicht überprüft wird.quelle
J, 13 Bytes
Dies ist eine monadische Funktion, die ein Array aufnimmt und eine Zahl zurückgibt. Benutze es so:
Erläuterung
Ich konstruiere explizit die dem Eingabearray zugeordnete Vandermonde-Matrix und berechne dann ihre Determinante.
quelle
.
es sich auch um ein Modifikatorzeichen handelt. Gleiches für sich:
.∘
), wie beim Jotting mit J ... Das unglaublich überladene.
und:
(was wiederum optisch dasselbe wie zwei gestapelte.
s ist) macht J (für mich) schwer lesbar. Umso mehr, wenn Leerzeichen neben den Punkten die Bedeutung bestimmen! Js.
müssen das am meisten überladene Symbol in der gesamten Computergeschichte sein: Ich zähle 53 verschiedene Bedeutungen von.
und 43 (61, wenn Sie alle_9:
bis zählen9:
) verschiedene Bedeutungen von:
. Yukk. ;-)MATL , 9
Probieren Sie es online!
Dadurch wird eine Matrix aller Unterschiede berechnet, und es wird nur der Teil unterhalb der Hauptdiagonale beibehalten, sodass die anderen Einträge
1
das Produkt nicht beeinträchtigen. Die untere Dreiecksfunktion macht die unerwünschten Elemente0
nicht1
. Also subtrahieren wir1
, nehmen den unteren dreieckigen Teil und addieren1
zurück. Dann können wir das Produkt aus allen Einträgen entnehmen.quelle
2Xn!dp
scheint nur mit einzelnen Werten zu funktionieren, wenn der Wert größer oder gleich 2 ist ... Ich hatte es selbst geschrieben und versucht, Jelly zu schlagen: PXn
eine Überprüfung durchführen müssenif size(arg) == [1,1] ...
oder so. Ich bin zu faul, um durch die Quelle zu schauen, aber (hoffentlich) sollte es nicht so schwierig sein.1
oder sein,0
und es macht dann keinen Unterschied, ob die erste Eingabe als Array oder als Zahl interpretiert wird. Das eigentliche Problem ist, dass die zweite Eingabe die Array-Größe nicht überschreiten kann. Msgstr "Wie viele Möglichkeiten gibt es, 2 Elemente aus 1 Element auszuwählen?" In diesem Fall ist der Unterschied zwischen Array und Nummer von Bedeutung: Wenn die erste Eingabe eine Array-Rückgabe ist[]
(leeres Array), ist es eine Zahlenrückgabe0
. Ich denke, ich werde zurückkehren[]
, weil dannp
die andere InterpretationPyth,
15131211 BytesVielen Dank an @FryAmTheEggman und @ Pietu1998 für jeweils ein Byte!
quelle
Mathematica, 32 Bytes
Ich war überrascht, dass ich kein eingebautes Gerät für Vandermonde gefunden habe. Wahrscheinlich, weil es so einfach ist, es selbst zu machen.
Dieser konstruiert explizit die Transponierung einer VM und nimmt ihre Determinante (die natürlich mit der des Originals identisch ist). Diese Methode erwies sich als erheblich kürzer als die Verwendung einer mir bekannten Formel.
quelle
Haskell, 34 Bytes
Eine rekursive Lösung. Wenn ein neues Element
h
vorangestellt wird, wird der Ausdruckx-h
für jedes Elementx
der Liste mit dem Produkt von multipliziert . Danke an Zgarb für 1 Byte.quelle
Matlab, 26 Bytes
(nicht konkurrierend)
Einfache Verwendung von Builtins. Beachten Sie, dass Matlab's (noch einmal)
vander
Vandermonde-Matrizen erstellt, wobei jedoch die Reihenfolge der Zeilen vertauscht wird.quelle
Rust, 86 Bytes
Rust, wortreich wie immer ...
Die Erklärung wird später kommen (es ist jedoch ziemlich einfach).
quelle
Perl, 38
41BytesFügen Sie +1 für
-p
Geben Sie die Zahlen in einer Zeile auf STDIN ein. Also zB laufen als
Benutze einen bösen Regex, um die doppelte Schleife zu erhalten:
vandermonde.pl
:quelle
JavaScript (ES6), 61 Byte
Ich habe versucht, ein Array zu verstehen (Firefox 30-57) und es war 5 Bytes länger:
Die langweilige verschachtelte Schleife ist jedoch wahrscheinlich kürzer.
quelle
Haskell, 53 Bytes
Anwendungsbeispiel:
f [1,2,4,8,16]
->20321280
.Gehen Sie die Indizes
j
undi
in einer verschachtelten Schleife durch und erstellen Sie eine Liste der Unterschiede der Elemente an Positionj
undi
. Machen Sie das Produkt aus allen Elementen in der Liste.Andere Varianten, die sich als etwas länger herausstellten:
f x=product[last l-i|l<-scanl1(++)$pure<$>x,i<-init l]
54 Bytesimport Data.List;f i=product[y-x|[x,y]<-subsequences i]
55 Bytesquelle
CJam, 16 Bytes
Als Antwort auf den Beitrag von A Simmons , obwohl CJam keinen Kombinationsoperator hat, ist es möglich, es besser zu machen :)
-1 Byte Danke an @ MartinBüttner.
Versuchen Sie es online | Testsuite
quelle
CJam, 32 Bytes
Ich bin sicher, dass jemand in CJam besser Golf spielen kann ... Das Hauptproblem ist, dass ich keinen guten Weg sehe, um die Teilmengen zu erhalten, die den größten Teil meiner Bytes verbrauchen. Dies erzeugt den Kraftsatz (nach einer Idee von Martin Büttner) und wählt dann die Elemente der Länge 2 aus.
quelle
R , 41 Bytes
Probieren Sie es online!
Ich war überrascht, hier keine Antwort von R zu sehen!
quelle
Perl 5
-pa
, 36 BytesProbieren Sie es online!
quelle