Diberikan vektor n
nilai (x1,x2,x3,...,xn)
mengembalikan penentu matriks Vandermonde yang sesuai .
Penentu ini dapat ditulis sebagai:
Detail
Program / fungsi Anda harus menerima daftar angka floating point dalam format apa pun yang memungkinkan untuk panjang variabel, dan output penentu yang ditentukan.
Anda dapat mengasumsikan bahwa input serta output berada dalam kisaran nilai yang didukung bahasa Anda. Jika bahasa Anda tidak mendukung angka floating point, Anda dapat mengasumsikan bilangan bulat.
Beberapa test case
Perhatikan bahwa setiap kali ada dua entri yang sama, determinannya adalah 0
karena ada dua baris yang sama dalam matriks Vandermonde yang sesuai. Terima kasih kepada @randomra karena menunjukkan testcase yang hilang ini.
[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
code-golf
math
matrix
linear-algebra
cacat
sumber
sumber
[1,2,2,3] => 0
:: dua elemen yang sama dalam array, untuk menguji apakah kode memeriksa perbedaan sendiri (xi-xi
) hanya dengan membandingkan0
.Jawaban:
Jelly, 6 byte
œc2
mendapatkan semua kombinasi tanpa penggantian panjang 2.I
menghitung daftar perbedaan dari masing-masing pasangan, menghasilkan daftar seperti[[1], [2], [3], ..., [1]]
. KamiF
latten dan mengambilP
roduct.Coba di sini!
sumber
Ruby,
4947 byteIni adalah fungsi lambda yang menerima array satu dimensi yang bernilai nyata dan mengembalikan float atau integer tergantung pada jenis input. Untuk memanggilnya, tetapkan ke variabel lalu lakukan
f.call(input)
.Kami mendapatkan semua kombinasi ukuran 2 menggunakan
.combination(2)
dan mendapatkan perbedaan untuk setiap pasangan menggunakan.map {|a, b| b - a}
. Kami bergabung dengan array yang dihasilkan menjadi string yang dipisahkan oleh*
, lalueval
ini, yang mengembalikan produk. Jika input memiliki panjang 1, ini akan menjadinil
, yang merupakan kesalahan dalam Ruby, jadi kita bisa saja||1
pada akhirnya untuk mengembalikan 1 dalam situasi ini. Perhatikan bahwa ini masih berfungsi ketika produk 0 karena untuk alasan apa pun 0 benar di Ruby.Verifikasi semua kasus uji online
Disimpan 2 byte berkat Doorknob!
sumber
Mathematica, 30 byte
Ini adalah fungsi anonim.
Diperluas oleh Mathematica, itu setara dengan
(1 ##1 & ) @@ Apply[#2 - #1 & , Subsets[#1, {2}], {1}] &
.1##&
adalah setara denganTimes
(halaman tips terima kasih), yang diterapkan pada setiap pasangan elemen yang berbeda dari daftar input, yang dihasilkan olehSubsets[list, {2}]
. Perhatikan bahwaSubsets
tidak memeriksa keunikan elemen.sumber
J, 13 byte
Ini adalah fungsi monadik yang mengambil array dan mengembalikan angka. Gunakan seperti ini:
Penjelasan
Saya secara eksplisit membangun matriks Vandermonde yang terkait dengan array input, dan kemudian menghitung determinannya.
sumber
.
juga merupakan karakter pengubah. Sama untuknya:
sendiri.∘
), seperti dalam penulisan dengan J ... Yang sangat kelebihan beban.
dan:
(yang lagi-lagi secara visual sama dengan dua.
s yang ditumpuk ) membuat J sulit dibaca (untuk saya). Terlebih lagi ketika spasi putih di sebelah titik-titik menentukan makna! J.
harus simbol yang paling kelebihan beban dalam sejarah komputasi: Saya menghitung 53 makna yang berbeda.
dan 43 (61 jika Anda menghitung semua_9:
untuk9:
) makna yang berbeda:
. Yukk. ;-)MATL , 9
Cobalah online!
Ini menghitung matriks dari semua perbedaan dan kemudian hanya menyimpan bagian di bawah diagonal utama, membuat entri lain
1
sehingga mereka tidak akan mempengaruhi produk. Fungsi segitiga bawah membuat elemen yang tidak diinginkan0
, tidak1
. Jadi kita kurangi1
, ambil bagian segitiga bawah, dan tambahkan1
kembali. Lalu kita bisa mengambil produk dari semua entri.sumber
2Xn!dp
tampaknya hanya berfungsi dengan nilai tunggal ketika nilainya lebih dari atau sama dengan 2 ... Saya telah menulisnya sendiri mencoba untuk mengalahkan Jelly: PXn
melakukan pemeriksaan sukaif size(arg) == [1,1] ...
atau sesuatu. Saya terlalu malas untuk melihat dari sumbernya, tapi (semoga) itu tidak terlalu sulit.1
atau0
dan tidak ada bedanya jika input pertama diartikan sebagai array atau sebagai angka. Masalah sebenarnya adalah, input kedua tidak dapat melebihi ukuran array. "Ada berapa cara untuk memilih 2 elemen dari 1 elemen". Dalam hal ini perbedaan array / angka penting: jika input pertama adalah pengembalian array[]
(array kosong), jika itu adalah angka kembali0
. Saya kira saya akan kembali[]
, karena kemudianp
memaksa interpretasi lainPyth,
15131211 byteTerima kasih kepada @FryAmTheEggman dan @ Pietu1998 untuk setiap byte!
sumber
Mathematica, 32 byte
Saya terkejut tidak menemukan builtin untuk hal-hal Vandermonde. Mungkin karena begitu mudah melakukannya sendiri.
Yang satu ini secara eksplisit membangun transpose dari suatu VM dan mengambil determinannya (yang tentu saja sama dengan yang asli). Metode ini ternyata jauh lebih singkat daripada menggunakan formula apa pun yang saya tahu.
sumber
Haskell, 34 byte
Solusi rekursif. Ketika elemen baru
h
ditambahkan ke depan, ekspresi dikalikan dengan produkx-h
untuk setiap elemenx
daftar. Terima kasih kepada Zgarb untuk 1 byte.sumber
Matlab, 26 byte
(tidak bersaing)
Penggunaan langsung builtin. Perhatikan bahwa (sekali lagi) Matlab
vander
menciptakan matriks Vandermonde tetapi dengan urutan baris terbalik.sumber
Rust, 86 byte
Karat, bertele-tele seperti biasa ...
Penjelasan akan datang nanti (cukup mudah, sih).
sumber
Perl, 38
41byteSertakan +1 untuk
-p
Berikan nomor pada garis di STDIN. Jadi misalnya dijalankan
Gunakan regex jahat untuk mendapatkan loop ganda:
vandermonde.pl
:sumber
JavaScript (ES6), 61 byte
Saya mencoba pemahaman array (Firefox 30-57) dan panjangnya 5 byte:
Nested loop yang membosankan mungkin lebih pendek.
sumber
Haskell, 53 byte
Contoh penggunaan:
f [1,2,4,8,16]
->20321280
.Pergi melalui indeks
j
dani
dalam loop bersarang dan buat daftar perbedaan elemen pada posisij
dani
. Buat produk dari semua elemen dalam daftar.Varian lain yang ternyata sedikit lebih panjang:
f x=product[last l-i|l<-scanl1(++)$pure<$>x,i<-init l]
, 54 byteimport Data.List;f i=product[y-x|[x,y]<-subsequences i]
, 55 bytesumber
CJam, 16 byte
Menanggapi posting A Simmons , meskipun CJam tidak memiliki operator kombinasi, ya dimungkinkan untuk melakukan yang lebih baik :)
-1 byte terima kasih kepada @ MartinBüttner.
Cobalah online | Suite uji
sumber
CJam, 32 byte
Saya yakin seseorang dapat bermain golf ini lebih baik di CJam ... Masalah utamanya adalah saya tidak bisa melihat cara yang baik untuk mendapatkan subset sehingga menghabiskan sebagian besar byte saya. Ini menghasilkan set daya (menggunakan ide oleh Martin Büttner) dan kemudian memilih elemen panjang-2.
sumber
R , 41 byte
Cobalah online!
Saya terkejut tidak melihat jawaban R di sini!
sumber
Perl 5
-pa
, 36 byteCobalah online!
sumber