Podany wektor n
wartości (x1,x2,x3,...,xn)
zwraca wyznacznik odpowiedniej macierzy Vandermonde .
Tę determinantę można zapisać jako:
Detale
Twój program / funkcja musi zaakceptować listę liczb zmiennoprzecinkowych w dowolnym dogodnym formacie, który pozwala na zmienną długość, i wyprowadzić określoną determinantę.
Możesz założyć, że dane wejściowe i wyjściowe mieszczą się w zakresie wartości obsługiwanych przez Twój język. Jeśli Twój język nie obsługuje liczb zmiennoprzecinkowych, możesz założyć liczby całkowite.
Niektóre przypadki testowe
Zauważ, że ilekroć są dwa równe wpisy, wyznacznikiem będzie, 0
ponieważ w odpowiedniej macierzy Vandermonde znajdują się dwa równe rzędy. Dzięki @randomra za wskazanie tej brakującej skrzynki testowej.
[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
: dwa równe elementy w tablicy, aby sprawdzić, czy kod sprawdza różnicę (xi-xi
) tylko przez porównanie z0
.Odpowiedzi:
Galaretka, 6 bajtów
œc2
pobiera wszystkie kombinacje bez zamiany długości 2.I
oblicza listę różnic dla każdej z tych par, dając listę podobną do[[1], [2], [3], ..., [1]]
. MamyF
Latten i podjąćP
roduct.Wypróbuj tutaj!
źródło
Ruby,
4947 bajtówJest to funkcja lambda, która przyjmuje tablicę jednowymiarową o wartościach rzeczywistych i zwraca liczbę zmiennoprzecinkową lub liczbę całkowitą w zależności od typu danych wejściowych. Aby go wywołać, przypisz go do zmiennej, a następnie zrób
f.call(input)
.Otrzymujemy wszystkie kombinacje rozmiaru 2 używamy
.combination(2)
i otrzymujemy różnice dla każdej pary używającej.map {|a, b| b - a}
. Łączymy wynikową tablicę w ciąg oddzielony*
, a następnieeval
ten, który zwraca produkt. Jeśli dane wejściowe mają długość 1, będzienil
to wartość falsey w Ruby, więc możemy||1
na końcu zwrócić 1 w tej sytuacji. Zauważ, że to nadal działa, gdy produkt ma wartość 0, ponieważ z jakiegokolwiek powodu 0 jest zgodne z Ruby.Sprawdź wszystkie przypadki testowe online
Zaoszczędzono 2 bajty dzięki Klamce!
źródło
Mathematica, 30 bajtów
To anonimowa funkcja.
Rozszerzony przez Mathematica jest równoważny
(1 ##1 & ) @@ Apply[#2 - #1 & , Subsets[#1, {2}], {1}] &
.1##&
jest odpowiednikiemTimes
(strona z poradami dzięki), który jest stosowany do każdej odrębnej pary elementów z listy danych wejściowych, generowanych przezSubsets[list, {2}]
. Pamiętaj, żeSubsets
nie sprawdza wyjątkowości elementów.źródło
J, 13 bajtów
Jest to funkcja monadyczna, która przyjmuje tablicę i zwraca liczbę. Użyj tego w ten sposób:
Wyjaśnienie
Wyraźnie konstruuję macierz Vandermonde powiązaną z tablicą wejściową, a następnie obliczam jej wyznacznik.
źródło
.
jest także znakiem modyfikującym. To samo dotyczy:
samego.∘
), jak w przypadku zapisywania za pomocą J ... Niezwykle przeciążone.
i:
(które znowu jest wizualnie takie samo jak dwa stosy.
) sprawia, że J jest trudny do odczytania (dla mnie). O ile bardziej, gdy białe spacje obok kropek określają znaczenie! J użytkownika.
musi być najbardziej przeciążony symbol w całej historii obliczeniowej: Liczę 53 różnych znaczeń.
i 43 (61, jeśli liczyć wszystkie_9:
do9:
) różne znaczenia:
. Fuj. ;-)MATL , 9
Wypróbuj online!
To oblicza macierz wszystkich różnic, a następnie utrzymuje tylko część poniżej głównej przekątnej, czyniąc pozostałe wpisy,
1
aby nie wpływały na produkt. Dolna trójkątna funkcja sprawia, że niechciane elementy0
nie1
. Odejmujemy1
, bierzemy dolną trójkątną część i dodajemy z1
powrotem. Następnie możemy wziąć iloczyn wszystkich wpisów.źródło
2Xn!dp
wydaje się, że działa tylko z pojedynczymi wartościami, gdy wartość jest większa lub równa 2 ... Napisałem to sam, próbując pokonać Jelly: PXn
w stanie wykonać kontrolęif size(arg) == [1,1] ...
lub coś w tym rodzaju. Jestem zbyt leniwy, by patrzeć przez źródło, ale (mam nadzieję) nie powinno to być takie trudne.1
lub0
i wtedy nie ma znaczenia, czy pierwsze wejście jest interpretowane jako tablica czy jako liczba. Prawdziwy problem polega na tym, że drugie wejście nie może przekroczyć rozmiaru tablicy. „Ile jest sposobów wyboru 2 elementów z 1 elementu”. W tym przypadku różnica między tablicą / liczbą ma znaczenie: jeśli pierwszym wejściem jest powrót do tablicy[]
(pusta tablica), jeśli jest to powrót liczby0
. Chyba wrócę[]
, bo wtedyp
wymusza drugą interpretacjęPyth,
15131211 bajtówDzięki @FryAmTheEggman i @ Pietu1998 za bajt każdy!
źródło
Mathematica, 32 bajty
Byłem zaskoczony, że nie znalazłem wbudowanego w Vandermonde. Prawdopodobnie dlatego, że tak łatwo to zrobić samemu.
Ta jednoznacznie konstruuje transpozycję VM i przyjmuje jej wyznacznik (który jest oczywiście taki sam jak oryginał). Ta metoda okazała się znacznie krótsza niż przy użyciu jakiejkolwiek znanej mi formuły.
źródło
Haskell, 34 bajty
Rozwiązanie rekurencyjne. Kiedy nowy element
h
jest dodawany na początku, wyrażenie jest mnożone przez iloczynx-h
każdego z elementówx
listy. Dzięki Zgarb za 1 bajt.źródło
Matlab, 26 bajtów
(niekonkurencyjny)
Proste użycie wbudowanych funkcji. Zauważ, że (jeszcze raz) Matlab
vander
tworzy macierze Vandermonde, ale z odwróconą kolejnością wierszy.źródło
Rdza, 86 bajtów
Rdza, jak zwykle verbose ...
Wyjaśnienia nadejdą później (choć jest to dość proste).
źródło
Perl, 38
41bajtówUwzględnij +1 dla
-p
Podaj liczby w wierszu na STDIN. Więc np. Uruchom jako
Użyj wyrażenia regularnego zła, aby uzyskać podwójną pętlę:
vandermonde.pl
:źródło
JavaScript (ES6), 61 bajtów
Próbowałem zrozumieć tablicę (Firefox 30-57) i było to o 5 bajtów dłużej:
Nudna zagnieżdżona pętla jest jednak prawdopodobnie krótsza.
źródło
Haskell, 53 bajty
Przykład użycia:
f [1,2,4,8,16]
->20321280
.Przejdź przez indeksy
j
ii
zagnieżdżoną pętlę i zrób listę różnic między elementami w pozycjij
ii
. Zrób iloczyn wszystkich elementów z listy.Inne warianty, które okazały się nieco dłuższe:
f x=product[last l-i|l<-scanl1(++)$pure<$>x,i<-init l]
, 54 bajtyimport Data.List;f i=product[y-x|[x,y]<-subsequences i]
, 55 bajtówźródło
CJam, 16 bajtów
W odpowiedzi na post A Simmonsa , pomimo braku operatora kombinacji CJama, tak, można zrobić lepiej :)
-1 bajt dzięki @ MartinBüttner.
Wypróbuj online | Zestaw testowy
źródło
CJam, 32 bajty
Jestem pewien, że ktoś może lepiej zagrać w golfa w CJam ... Głównym problemem jest to, że nie widzę dobrego sposobu na uzyskanie podzbiorów, który zużywa większość moich bajtów. To generuje zestaw mocy (według pomysłu Martina Büttnera), a następnie wybiera elementy długości 2.
źródło
R , 41 bajtów
Wypróbuj online!
Byłem zaskoczony, że nie widziałem tutaj odpowiedzi R.
źródło
Perl 5
-pa
, 36 bajtówWypróbuj online!
źródło