Produk silang dari dua vektor tiga dimensi dan adalah vektor unik sedemikian rupa sehingga:
adalah ortogonal untuk dan
Besarnya sama dengan luas jajaran genjang yang dibentuk oleh dan
Arah , , dan , dalam urutan itu, ikuti aturan sebelah kanan .
Ada beberapa rumus setara untuk produk silang, tetapi satu adalah sebagai berikut:
di mana , , dan adalah vektor satuan dalam dimensi pertama, kedua, dan ketiga.
Tantangan
Diberi dua vektor 3D, tulis satu program penuh atau fungsi untuk menemukan produk silang mereka. Builtin yang secara spesifik menghitung produk silang tidak diizinkan.
Memasukkan
Dua array masing-masing tiga bilangan real. Jika bahasa Anda tidak memiliki array, angka-angka masih harus dikelompokkan menjadi tiga. Kedua vektor akan memiliki magnitudo . Perhatikan bahwa produk silang adalah nonkomunikasi ( ), jadi Anda harus memiliki cara untuk menentukan pesanan.
Keluaran
Produk silang mereka, dalam format yang masuk akal, dengan setiap komponen akurat hingga empat angka signifikan atau , mana yang lebih longgar. Notasi ilmiah bersifat opsional.
Uji kasus
[3, 1, 4], [1, 5, 9]
[-11, -23, 14]
[5, 0, -3], [-3, -2, -8]
[-6, 49, -10]
[0.95972, 0.25833, 0.22140],[0.93507, -0.80917, -0.99177]
[-0.077054, 1.158846, -1.018133]
[1024.28, -2316.39, 2567.14], [-2290.77, 1941.87, 712.09]
[-6.6345e+06, -6.6101e+06, -3.3173e+06]
Ini adalah kode-golf , jadi solusi terpendek dalam byte menang.
Maltysen memposting tantangan serupa , tetapi tanggapannya buruk dan pertanyaannya tidak diedit.
sumber
Jawaban:
Jelly,
141312 byteCobalah online!
Bagaimana itu bekerja
Versi tidak bersaing (10 byte)
OK, ini memalukan, tetapi bahasa manipulasi array Jelly tidak memiliki built-in untuk rotasi array sampai sekarang. Dengan built-in yang baru ini, kita dapat menyimpan dua byte tambahan.
Ini menggunakan pendekatan dari jawaban J @ AlexA . Cobalah online!
Bagaimana itu bekerja
sumber
PELAT,
128122 byteHai! Ini kode saya:
Saya tahu bahwa itu bukan solusi terpendek, tetapi tidak ada yang memberikan satu di Lisp, sampai sekarang :)
Salin dan tempel kode berikut di sini untuk mencobanya!
sumber
Dyalog APL, 12 byte
Berdasarkan jawaban J @ AlexA. Dan (kebetulan) setara dengan peningkatan @ randomra di bagian komentar jawaban itu.
Cobalah online di TryAPL .
Bagaimana itu bekerja
sumber
J,
2714 byteIni adalah kata kerja diad yang menerima array di kiri dan kanan dan mengembalikan produk silang mereka.
Penjelasan:
Contoh:
Coba di sini
Disimpan 13 byte berkat randomra!
sumber
*2&|.
adalah fork dari dua kata kerja:*
dan2&|.
. Ini mengalikan input kiri dengan diputar oleh 2 input kanan. Garpu ini disimpanv
jadi ketika kita menulisv~
, itu setara dengan(*2&|.)~
, di mana~
menukar parameter input kiri dan kanan untuk bagian yang di-kurung.C,
156154150148144 byteTidak akan memenangkan hadiah lama, tapi kupikir aku harus tetap pergi.
Demo
Tidak Terkumpul:
sumber
for
Anda tidak perlu{}
Haskell, 41 byte
Solusi mudah.
sumber
Bash + coreutils, 51
bc
melakukan evaluasi aritmatika dengan presisi yang diperlukan.Input adalah sebagai dua daftar yang dipisahkan koma pada baris perintah. Output sebagai baris yang dipisahkan baris baru:
sumber
MATL , 17 byte
Input pertama adalah a , kedua adalah b .
Cobalah online!
Penjelasan
sumber
Pyth, 16 byte
Cobalah online: Demonstrasi
Penjelasan:
sumber
K5,
44403732 byteMenulis yang ini beberapa waktu yang lalu dan membersihkannya lagi baru-baru ini .
Dalam aksi:
Edit 1:
Disimpan 4 byte dengan mengambil input sebagai daftar daftar alih-alih dua argumen terpisah:
Edit 2:
Disimpan 3 byte dengan menghitung tabel pencarian dengan basis-decode:
Edit 3:
Simpan 5 byte dengan mengatur ulang aplikasi untuk mengizinkan menggunakan definisi diam-diam alih-alih lambda lokal. Sayangnya, solusi ini tidak lagi berfungsi di oK, dan membutuhkan juru bahasa resmi k5. Harus mengambil kata-kata saya untuk yang satu ini sampai saya memperbaiki bug di oK:
sumber
Ruby , 49 byte
Cobalah online!
Kembali setelah 2 tahun, saya mencukur 12 byte dengan menggunakan cara Ruby memperlakukan indeks array negatif.
-1
adalah elemen terakhir dari array,-2
yang terakhir terakhir dll.Ruby, 57
Dalam program uji
sumber
Python,
7348 byteTerima kasih @FryAmTheEggman
Ini didasarkan pada definisi komponen produk lintas vektor.
Coba di sini
sumber
lambda (a,b,c),(d,e,f):...
harus menghemat banyak.Jeli , 5 byte
Mengambil input dalam formulir[ [ x1, x2] , [ y1, y2] , [ z1, z2] ] . Jika Anda ingin mereka menjadi dua daftar koordinat xyz, cukup tambahkan
Z
awal program.Cobalah online!
Berikut adalah penjelasan PDF jika penurunan harga SE tidak dapat mengatasinya.
Produk silang dalam bentuk analitik
Membiarkan( x1, y1, z1) menjadi koordinat dari v1→ dan ( x2, y2, z2) menjadi koordinat dari v2→ . Ekspresi analitik mereka adalah sebagai berikut:
The only thing left to do now is to also write their cross-product in terms of its coordinates in theOxyz space.
Keeping in mind that:i⃗ ×j⃗ =k⃗ ,i⃗ ×k⃗ =−j⃗ ,j⃗ ×i⃗ =−k⃗ ,j⃗ ×k⃗ =i⃗ ,k⃗ ×i⃗ =j⃗ ,k⃗ ×j⃗ =−i⃗
After the necessary rearrangements and calculations:
The close relationship with matrix determinants
There's an interesting thing to note here:
Where we use the notation|⋅| for matrix determinant. Notice the beautiful rotational symmetry?
Jelly code explanation
Well... not much to explain here. It just generates the matrix:
And for each pair of neighbouring matrices, it computes the determinant of the matrix formed by joining the two.
sumber
Wolfram Language (Mathematica),
3833 bytesTry it online!
sumber
ES6, 40 bytes
44 bytes if the input needs to be two arrays:
52 bytes for a more interesting version:
sumber
Julia 0.7,
4539 bytesTry it online!
Uses the determinant-based formula given in the task description.
Thanks to H.PWiz for -6 bytes.
sumber
f(a,b)=1:3 .|>i->det([eye(3)[i,:] a b])
APL(NARS), 23 chars, 46 bytes
test:
sumber
Pari/GP, 41 bytes
Try it online!
sumber