Tulis fungsi atau program bernama yang menghitung produk angka empat dari dua angka empat. Gunakan sesedikit mungkin byte.
Pertanyaan
Kuota adalah perpanjangan dari bilangan real yang selanjutnya memperluas bilangan kompleks. Daripada satu unit imajiner tunggal i
, angka empat menggunakan tiga unit imajiner i,j,k
yang memuaskan hubungan.
i*i = j*j = k*k = -1
i*j = k
j*i = -k
j*k = i
k*j = -i
k*i = j
i*k = -j
(Ada juga tabel ini di halaman Wikipedia .)
Dalam kata-kata, setiap unit imajiner kuadratkan -1
, dan produk dari dua unit imajiner yang berbeda adalah yang ketiga tersisa dengan +/-
tergantung pada apakah urutan siklik (i,j,k)
dihormati (yaitu, aturan tangan kanan ). Jadi, urutan perkalian penting.
Angka empat umum adalah kombinasi linear dari bagian nyata dan tiga unit imajiner. Jadi, ini dijelaskan oleh empat bilangan real (a,b,c,d)
.
x = a + b*i + c*j + d*k
Jadi, kita dapat mengalikan dua angka empat menggunakan properti distributif, berhati-hati untuk mengalikan unit dalam urutan yang benar, dan mengelompokkan istilah seperti dalam hasil.
(a + b*i + c*j + d*k) * (e + f*i + g*j + h*k)
= (a*e - b*f - c*g - d*h) +
(a*f + b*e + c*h - d*g)*i +
(a*g - b*h + c*e + d*f)*j +
(a*h + b*g - c*f + d*e)*k
Dilihat dengan cara ini, perkalian angka empat dapat dilihat sebagai peta dari sepasang 4-tupel menjadi 4-tupel tunggal, yang diminta untuk diterapkan.
Format
Anda harus menulis fungsi program atau bernama . Suatu program harus mengambil input dari STDIN dan mencetak hasilnya. Suatu fungsi harus menerima input fungsi dan mengembalikan (tidak mencetak) output.
Format input dan output fleksibel. Input adalah delapan bilangan real (koefisien untuk dua angka empat), dan output terdiri dari empat bilangan real. Input mungkin delapan angka, dua daftar empat angka, matriks 2x4, dll. Format input / output tidak harus sama. Pengurutan (1,i,j,k)
koefisien terserah Anda.
Koefisien bisa negatif atau tidak keseluruhan. Jangan khawatir tentang ketepatan nyata atau meluap.
Dilarang: Fungsi atau tipe khusus untuk angka empat atau setara.
Uji kasus
Ini dalam (1,i,j,k)
format koefisien.
[[12, 54, -2, 23], [1, 4, 6, -2]]
[-146, -32, 270, 331]
[[1, 4, 6, -2], [12, 54, -2, 23]]
[-146, 236, -130, -333]
[[3.5, 4.6, -0.24, 0], [2.1, -3, -4.3, -12]]
[20.118, 2.04, 39.646, -62.5]
Implementasi Referensi
Dalam Python, sebagai fungsi:
#Input quaternions: [a,b,c,d], [e,f,g,h]
#Coeff order: [1,i,j,k]
def mult(a,b,c,d,e,f,g,h):
coeff_1 = a*e-b*f-c*g-d*h
coeff_i = a*f+b*e+c*h-d*g
coeff_j = a*g-b*h+c*e+d*f
coeff_k = a*h+b*g-c*f+d*e
result = [coeff_1, coeff_i, coeff_j, coeff_k]
return result
sumber
Python -
90 75 7269Python Murni, tanpa perpustakaan - 90:
Mungkin cukup sulit untuk mempersingkat solusi "default" ini dengan Python. Tapi saya sangat ingin tahu apa yang mungkin muncul dengan orang lain. :)
Menggunakan NumPy -
75 7269:Nah, karena input dan output agak fleksibel, kita dapat menggunakan beberapa fungsi NumPy dan mengeksploitasi representasi skalar-vektor :
Masukan argumen
s
dant
merupakan bagian skalar dari dua angka empat (bagian nyata) danp
danq
merupakan bagian vektor yang sesuai (unit imajiner). Output adalah daftar yang berisi bagian skalar dan bagian vektor dari angka empat yang dihasilkan, yang terakhir direpresentasikan sebagai array NumPy.Skrip tes sederhana:
(
mult(...)
menjadi implementasi referensi OP.)Keluaran:
sumber
Haskell, 85
Porting ke Haskell menyelamatkan kita beberapa karakter;)
sumber
Mathematica
8350Mungkin bisa bermain golf lagi ..
Spasi dan baris baru tidak dihitung & tidak diperlukan.
Pemakaian:
EDIT Cara kerjanya.
Fungsi Mathematica
Permutations
membuat semua kemungkinan permutasi#2
(argumen kedua). Ada 24 permutasi, tapi kita hanya perlu{e,f,g,h}
,{f,e,h,g}
,{g,h,e,f}
, dan{h,g,f,e}
. Ini adalah permutasi pertama, 8, 17 dan 24. Jadi kodenyatepatnya memilih ini dari permutasi argumen kedua dan mengembalikannya sebagai matriks. Tapi mereka belum memiliki tanda yang benar. Kode
p[{-1,1,-1,1}][[1;;3]]
mengembalikan matriks 3x4 dengan tanda yang benar. Kami menambahkannya dengan{1,1,1,1}
menggunakanJoin
, dan membuat perkalian normal (Times
, atau seperti halnya di sini dengan hanya menulis satu sama lain) antara dua matriks membuat perkalian elemen demi elemen di Mathematica.Akhirnya, hasil dari
adalah matriks
Membuat perkalian matriks antara
{a,b,c,d}
(argumen pertama#1
) dan matriks sebelumnya memberikan hasil yang diinginkan.EDIT 2 Kode lebih pendek
Terinspirasi oleh kode Python dari Falko, saya membagi angka empat dalam skalar dan bagian vektor, dan menggunakan perintah built in Mathematica
Cross
untuk menghitung produk silang dari bagian vektor:Pemakaian:
sumber
1, 8, 17, 24
?Python, 94
Cara yang paling mudah tidak terlalu lama.
sumber
JavaScript ES6 - 86
sumber
Lua - 99
Mungkin juga.
"Unpack ()" Lua membebaskan elemen tabel. Jadi tabel 'arg' adalah tempat semua input baris perintah disimpan (termasuk
arg[0]
yang merupakan nama file program, akan dibuang).sumber
Python,
5856 karakterSaya mengambil sangat menggunakan ruang gerak input / output format yang liberal. Input adalah 4 bilangan kompleks, yang dikodekan sebagai berikut:
Ini menghasilkan sepasang bilangan kompleks dalam format yang sama, yang pertama dari pasangan mengkode nyata dan
i
bagian, yang kedua mengkodej
dank
.Untuk melihat ini berfungsi, perhatikan bahwa angka empat pertama adalah
x+y*j
dan yang kedua adalahz+w*j
. Cukup evaluasi(x+y*j)*(z+w*j)
dan sadari bahwaj*t
=conj(t)*j
untuk nomor imajiner apa punt
.sumber
i
danj
bertindak seperti koefisien kompleks dalam dan luar. Sangat menarik!(2*w.real-w)
.abs(w)**2/w
akan bekerja tetapi untuk 0. Mungkin bahkan eksekutif dengan substitusi string akan sia-sia? `Bisikan v2 , 396 byte
Cobalah online!
Mengambil input dalam formulir
dan output sebagai
untuk mewakiliq= w + x i + yj + zk
Struktur pohon dari jawaban ini adalah:
Sebagian besar jawaban ini berasal dari dua kesalahan utama di Whispers:
Karena itu, kita dapat membagi kode menjadi 3 bagian.
Bagaimana itu bekerja
Kami akan menggunakan definisi berikut untuk kejelasan dan keringkasan:
Bagian 1: PermutingSEBUAH dan B
Bagian pertama adalah yang terpanjang, membentang dari baris 1 ke baris 22 :
Tujuan utama bagian ini adalah untuk mengubah urutanB sehingga perkalian elemen-bijaksana sederhana antara SEBUAH dan B adalah mungkin. Ada empat pengaturan berbedaB untuk melipatgandakan elemen SEBUAH dengan:
Input kedua,B , disimpan pada baris 6 . Kami kemudian berpisahB di tengah, karena setiap kemungkinan pengaturan B dikelompokkan berpasangan. Untuk membalikkan pasangan ini (untuk mendapatkan pesanan yang benarB2 dan B4 ), kami mengambil elemen pertama dan terakhir, kemudian menggabungkannya dalam urutan terbalik:
(membentuk[ f, e ] ) dan
(membentuk[ h , g] ). Kami sekarang memiliki semua bagian yang diperlukan untuk membentuk pengaturan, jadi kami menggabungkannya untuk membentukB1, B2, B3 dan B4 . Akhirnya, kami menggabungkan empat pengaturan ini bersama untuk membentukBT . Kami kemudian dengan cepat membuatSEBUAHT , didefinisikan sebagai SEBUAH ulang 4 waktu:
When each element ofBT is multiplied by the corresponding element in AT , we get the (signless) values in q⋅p
Section 2: Signs and products
As said in Section 1, the values inAT and BT correspond to the signless (i.e. positive) values of each of the coefficients in q⋅p . No obvious pattern is found in the signs that would be shorter than simply hardcoding the array, so we hardcode the array:
We'll call this arrayS (signs). Next, we zip together each element in AT,BT and S and take the product of each sub-array e.g. [[a,e,1],[b,f,−1],…,[e,f,−1],[d,e,1]]→D=[ae,−bf,…,−ef,de] .
Section 3: Partitions and final sums.
Once we have the array of coefficients ofq⋅p , with signs, we need to split it into 4 parts (i.e. the four factorised coefficients of q⋅p ), and then take the sums. This leads us to the only golfing opportunity found: moving the
to line 4 rather than 26, as it is used 6 times, each time saving a byte by moving it. Unfortunately, this costs a byte changing the 9 to a 10, so only5 bytes are saved. The next section takes slices of size 4 from the front of D , saving each slice to the corresponding row and passing on the shortened list of D . Once 4 slices are taken, we the take the sum of each, before outputting them all.
sumber