Étant donné un vecteur de n
valeurs, (x1,x2,x3,...,xn)
renvoyer le déterminant de la matrice de Vandermonde correspondante .
Ce déterminant peut s'écrire:
Détails
Votre programme / fonction doit accepter une liste de nombres à virgule flottante dans n'importe quel format pratique qui permet une longueur variable et produire le déterminant spécifié.
Vous pouvez supposer que l'entrée ainsi que la sortie sont dans la plage des valeurs prises en charge par votre langue. Si votre langue ne prend pas en charge les nombres à virgule flottante, vous pouvez supposer des nombres entiers.
Quelques cas de test
Notez que chaque fois qu'il y a deux entrées égales, le déterminant sera 0
comme il y a deux lignes égales dans la matrice Vandermonde correspondante. Merci à @randomra d'avoir signalé ce testcase manquant.
[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
[1,2,2,3] => 0
:: deux éléments égaux dans le tableau, pour tester si le code vérifie l'auto-différence (xi-xi
) simplement en comparant à0
.Réponses:
Gelée, 6 octets
œc2
obtient toutes les combinaisons sans remplacement de la longueur 2.I
calcule la liste des différences de chacune de ces paires, donnant une liste comme[[1], [2], [3], ..., [1]]
. NousF
latten et prenons leP
roduct.Essayez-le ici!
la source
Rubis,
4947 octetsIl s'agit d'une fonction lambda qui accepte un tableau unidimensionnel à valeur réelle et renvoie un flottant ou un entier selon le type d'entrée. Pour l'appeler, affectez-le à une variable puis faites
f.call(input)
.Nous obtenons toutes les combinaisons de taille 2 en utilisant
.combination(2)
et obtenons les différences pour chaque paire en utilisant.map {|a, b| b - a}
. Nous joignons le tableau résultant dans une chaîne séparée par*
, puiseval
celle-ci, qui renvoie le produit. Si l'entrée a une longueur 1, ce seranil
, ce qui est falsey en Ruby, donc nous pouvons juste||1
à la fin retourner 1 dans cette situation. Notez que cela fonctionne toujours lorsque le produit est 0 car pour une raison quelconque, 0 est vrai en Ruby.Vérifiez tous les cas de test en ligne
Sauvegardé 2 octets grâce à Doorknob!
la source
Mathematica, 30 octets
Il s'agit d'une fonction anonyme.
Développé par Mathematica, il est équivalent à
(1 ##1 & ) @@ Apply[#2 - #1 & , Subsets[#1, {2}], {1}] &
.1##&
est un équivalent deTimes
(page de conseils de remerciement), qui est appliqué à chaque paire distincte d'éléments de la liste d'entrée, générée parSubsets[list, {2}]
. Notez queSubsets
cela ne vérifie pas l'unicité des éléments.la source
J, 13 octets
Il s'agit d'une fonction monadique qui prend un tableau et renvoie un nombre. Utilisez-le comme ceci:
Explication
Je construis explicitement la matrice Vandermonde associée au tableau d'entrée, puis calcule son déterminant.
la source
.
s'agit également d'un caractère modificateur. Pareil pour:
lui-même.∘
), comme en griffonnant avec J ... L'incroyablement surchargé.
et:
(qui est visuellement le même que deux.
s empilés ) rend J difficile à lire (pour moi). A plus forte raison lorsque les espaces à côté des points déterminent le sens! J ce.
doit être le symbole le plus surchargé dans toute l'histoire informatique: je compte 53 significations distinctes.
et 43 (61 si l' on compte tous_9:
à9:
) significations distinctes:
. Yukk. ;-)MATL , 9
Essayez-le en ligne!
Cela calcule une matrice de toutes les différences, puis ne conserve que la partie en dessous de la diagonale principale, ce qui rend les autres entrées
1
afin qu'elles n'affectent pas le produit. La fonction triangulaire inférieure rend les éléments indésirables0
, non1
. Donc on soustrait1
, on prend la partie triangulaire inférieure, et on rajoute1
. Ensuite, nous pouvons prendre le produit de toutes les entrées.la source
2Xn!dp
ne semble fonctionner avec des valeurs uniques que lorsque la valeur est supérieure ou égale à 2 ... Je l'avais écrit moi-même en essayant de battre Jelly: PXn
faites une vérification commeif size(arg) == [1,1] ...
ou quelque chose. Je suis trop paresseux pour regarder à travers la source, mais (espérons-le) ça ne devrait pas être si difficile.1
ou0
et cela ne fait aucune différence si la première entrée est interprétée comme un tableau ou comme un nombre. Le vrai problème est que la deuxième entrée ne peut pas dépasser la taille du tableau. "Combien y a-t-il de façons de choisir 2 éléments sur 1 élément". Dans ce cas, la différence tableau / nombre est importante: si la première entrée est un retour de tableau[]
(tableau vide), s'il s'agit d'un retour de nombre0
. Je suppose que je reviendrai[]
, car alorsp
force l'autre interprétationPyth,
15131211 octetsMerci à @FryAmTheEggman et @ Pietu1998 pour un octet chacun!
la source
Mathematica, 32 octets
J'ai été surpris de ne pas trouver de builtin pour les trucs Vandermonde. Probablement parce que c'est si facile de le faire soi-même.
Celui-ci construit explicitement la transposition d'une VM et prend son déterminant (qui est bien sûr le même que celui de l'original). Cette méthode s'est avérée être beaucoup plus courte que l'utilisation de toute formule que je connaisse.
la source
Haskell, 34 octets
Une solution récursive. Lorsqu'un nouvel élément
h
est ajouté au début, l'expression est multipliée par le produit dex-h
pour chaque élémentx
de la liste. Merci à Zgarb pour 1 octet.la source
Matlab, 26 octets
(non compétitif)
Utilisation simple des fonctions intégrées. Notez que (encore une fois) Matlab
vander
crée des matrices Vandermonde mais avec l'ordre des lignes inversées.la source
Rouille, 86 octets
Rouille, verbeuse comme d'habitude ...
L'explication viendra plus tard (c'est assez simple, cependant).
la source
Perl, 38
41octetsInclure +1 pour
-p
Donnez les chiffres sur une ligne sur STDIN. Donc, par exemple, exécutez
Utilisez un regex maléfique pour obtenir la double boucle:
vandermonde.pl
:la source
JavaScript (ES6), 61 octets
J'ai essayé une compréhension de tableau (Firefox 30-57) et c'était 5 octets de plus:
La boucle imbriquée ennuyeuse est probablement plus courte cependant.
la source
Haskell, 53 octets
Exemple d'utilisation:
f [1,2,4,8,16]
->20321280
.Parcourez les indices
j
eti
dans une boucle imbriquée et faites une liste des différences des éléments en positionj
eti
. Faites le produit de tous les éléments de la liste.Autres variantes qui se sont révélées être légèrement plus longues:
f x=product[last l-i|l<-scanl1(++)$pure<$>x,i<-init l]
, 54 octetsimport Data.List;f i=product[y-x|[x,y]<-subsequences i]
, 55 octetsla source
CJam, 16 octets
En réponse au message de A Simmons , malgré le manque d'opérateur de combinaisons de CJam, oui, il est possible de faire mieux :)
-1 octet grâce à @ MartinBüttner.
Essayez-le en ligne | Suite de tests
la source
CJam, 32 octets
Je suis sûr que quelqu'un peut mieux jouer au golf dans CJam ... Le principal problème est que je ne vois pas un bon moyen d'obtenir les sous-ensembles afin que la plupart de mes octets soient utilisés. Cela génère le jeu de puissance (en utilisant une idée de Martin Büttner), puis sélectionne les éléments de longueur 2.
la source
R , 41 octets
Essayez-le en ligne!
J'ai été surpris de ne pas voir de réponse R ici!
la source
Perl 5
-pa
, 36 octetsEssayez-le en ligne!
la source