Napisz nazwaną funkcję lub program, który oblicza iloczyn czwartorzędu z dwóch czwartorzędów. Użyj jak najmniej bajtów.
Czwartorzędy
Czwartorzędy są rozszerzeniem liczb rzeczywistych, który dodatkowo rozszerza liczby zespolone. Zamiast jednej urojonej jednostki i
, czwartorzędy używają trzech urojonych jednostek, i,j,k
które spełniają relacje.
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
(Są też ich tabele na stronie Wikipedii ).
Innymi słowy, każda wyimaginowana jednostka jest kwadratem do -1
, a iloczyn dwóch różnych urojonych jednostek jest pozostałą trzecią, w +/-
zależności od tego, czy (i,j,k)
przestrzegany jest cykliczny porządek (tj. Reguła po prawej stronie ). Tak więc kolejność mnożenia ma znaczenie.
Czwartorzęd ogólny jest liniową kombinacją części rzeczywistej i trzech urojonych jednostek. Tak więc jest opisany czterema liczbami rzeczywistymi (a,b,c,d)
.
x = a + b*i + c*j + d*k
Możemy więc pomnożyć dwa czwarte przy użyciu właściwości rozdzielającej, uważając, aby pomnożyć jednostki we właściwej kolejności i w wyniku grupować podobne terminy.
(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
Patrząc w ten sposób, mnożenie czwartorzędu może być postrzegane jako mapa od pary 4-krotek do pojedynczego 4-krotek, o co proszono cię zaimplementować.
Format
Powinieneś napisać program lub funkcję o nazwie . Program powinien pobrać dane wejściowe ze STDIN i wydrukować wynik. Funkcja powinna przyjmować dane wejściowe funkcji i zwracać (nie drukować) dane wyjściowe.
Formaty wejściowe i wyjściowe są elastyczne. Dane wejściowe to osiem liczb rzeczywistych (współczynniki dla dwóch czwartorzędów), a dane wyjściowe składają się z czterech liczb rzeczywistych. Dane wejściowe mogą składać się z ośmiu liczb, dwóch list czterech liczb, macierzy 2x4 itp. Format wejścia / wyjścia nie musi być taki sam. Kolejność (1,i,j,k)
współczynników zależy od Ciebie.
Współczynniki mogą być ujemne lub niecałe. Nie martw się o prawdziwą precyzję lub przepełnienie.
Zbanowany: funkcja lub typy specjalnie dla czwartorzędów lub ich odpowiedników.
Przypadki testowe
Są w (1,i,j,k)
formacie współczynnika.
[[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]
Wdrożenie referencyjne
W Pythonie, jako funkcja:
#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
Python -
90 75 7269Czysty Python, bez bibliotek - 90:
Prawdopodobnie bardzo trudno jest skrócić to „domyślne” rozwiązanie w Pythonie. Ale jestem bardzo ciekawy, co inni mogą wymyślić. :)
Korzystanie z NumPy -
75 7269:Ponieważ dane wejściowe i wyjściowe są dość elastyczne, możemy użyć niektórych funkcji NumPy i wykorzystać reprezentację wektora skalarnego :
Argumenty wejściowe
s
it
są częściami skalarnymi dwóch czwartorzędów (części rzeczywiste)p
iq
są odpowiednimi częściami wektorowymi (jednostki urojone). Dane wyjściowe to lista zawierająca część skalarną i część wektorową wynikowego czwartorzędu, przy czym ten ostatni jest reprezentowany jako tablica NumPy.Prosty skrypt testowy:
(
mult(...)
będące referencyjną realizacją PO).Wynik:
źródło
Haskell, 85
Przeniesienie go do Haskell oszczędza nam kilka znaków;)
źródło
Mathematica
8350Prawdopodobnie można grać w golfa więcej ..
Spacje i znaki nowej linii nie są liczone i nie są potrzebne.
Stosowanie:
EDYCJA Jak to działa.
Funkcja Mathematica
Permutations
dokonuje wszystkich możliwych permutacji#2
(drugiego argumentu). Istnieje 24 permutacji, ale wystarczy{e,f,g,h}
,{f,e,h,g}
,{g,h,e,f}
, i{h,g,f,e}
. Są to pierwsze, 8., 17. i 24. permutacje. Więc koddokładnie wybiera je z permutacji drugiego argumentu i zwraca je jako macierz. Ale wtedy nie mają jeszcze właściwego znaku. Kod
p[{-1,1,-1,1}][[1;;3]]
zwraca macierz 3x4 z poprawnym znakiem. Poprzedzamy to{1,1,1,1}
za pomocąJoin
, i zwykłe mnożenie (Times
lub tak jak tutaj, po prostu zapisywanie ich po sobie) między dwiema macierzami tworzy mnożenie element po elemencie w Mathematica.Tak więc w końcu wynik
jest matrycą
Wykonanie mnożenia macierzy między
{a,b,c,d}
(pierwszym argumentem#1
) a poprzednią macierzą daje pożądany wynik.EDYCJA 2 Krótszy kod
Zainspirowany kodem Falko w języku Python, podzieliłem czwartorzęd na część skalarną i wektorową i wykorzystuję wbudowane polecenie Mathematica
Cross
do obliczenia iloczynu krzyżowego części wektorowych:Stosowanie:
źródło
1, 8, 17, 24
jestPython, 94
Najprostszy sposób nie jest zbyt długi.
źródło
JavaScript ES6 - 86
źródło
Lua - 99
Może również.
„Unpack ()” Lui uwalnia elementy tabeli. Tak więc tabela „arg” jest miejscem, w którym przechowywane są wszystkie dane z wiersza poleceń (w tym
arg[0]
nazwa pliku programu, jest odrzucana).źródło
Python,
5856 znakówBiorę bardzo liberalne wykorzystania wejścia / wyjścia pomieszczenia Format wiggle. Dane wejściowe to 4 liczby zespolone, zakodowane w następujący sposób:
Wyprowadza parę liczb zespolonych w podobnym formacie, pierwsza z nich koduje wartość rzeczywistą i
i
część, druga koduje częśćj
ik
.Aby zobaczyć, jak to działa, należy zauważyć, że pierwszy czwartorzędowy jest,
x+y*j
a drugi jestz+w*j
. Wystarczy ocenić(x+y*j)*(z+w*j)
i zdać sobie sprawę, żej*t
=conj(t)*j
dla dowolnej liczby urojonejt
.źródło
i
ij
zachowują się jak wewnętrzne i zewnętrzne złożone współczynniki. Jak fascynujące!(2*w.real-w)
.abs(w)**2/w
działałoby, ale dla 0. Może nawet exec z podstawieniem łańcucha byłoby tego warte? `Whispers v2 , 396 bajtów
Wypróbuj online!
Pobiera dane wejściowe w formularzu
i wyniki jako
Drzewo struktury tej odpowiedzi to:
Znaczna część tej odpowiedzi pochodzi z dwóch głównych błędów w Szeptach:
Dlatego możemy podzielić kod na 3 sekcje.
Jak to działa
Użyjemy następujących definicji dla jasności i zwięzłości:
Pierwsza sekcja jest zdecydowanie najdłuższa i rozciąga się od linii 1 do linii 22 :
(formowanie[h,g] B1,B2,B3 B4 BT AT A 4
Część 2: Znaki i produkty
Sekcja 3: Partycje i sumy końcowe.
źródło