Trójwymiarowy Levi Civita symbol funkcji f
przy trójek liczb (i,j,k)
w każdym z kierunków {1,2,3}
, aby {-1,0,1}
określona jako:
f(i,j,k) = 0
kiedyi,j,k
nie są odrębne, tj.i=j
lubj=k
lubk=i
f(i,j,k) = 1
kiedy(i,j,k)
jest cykliczne przesunięcie(1,2,3)
, to jest jedno z(1,2,3), (2,3,1), (3,1,2)
.f(i,j,k) = -1
kiedy(i,j,k)
jest cykliczne przesunięcie(3,2,1)
, to jest jedno z(3,2,1), (2,1,3), (1,3,2)
.
Wynik jest znakiem permutacji (1,2,3)
, przy braku permutacji dając 0. Alternatywnie, jeśli skojarzymy wartości 1,2,3
z wektorami bazowymi jednostek ortogonalnych e_1, e_2, e_3
, f(i,j,k)
to wyznacznik macierzy 3x3 z kolumnami e_i, e_j, e_k
.
Wkład
Każda z trzech liczb {1,2,3}
. Lub możesz użyć indeksowania zerowego {0,1,2}
.
Wydajność
Ich wartość funkcji Levi-Civita od {-1,0,1}
. To jest kod golfowy.
Przypadki testowe
Istnieje 27 możliwych danych wejściowych.
(1, 1, 1) => 0
(1, 1, 2) => 0
(1, 1, 3) => 0
(1, 2, 1) => 0
(1, 2, 2) => 0
(1, 2, 3) => 1
(1, 3, 1) => 0
(1, 3, 2) => -1
(1, 3, 3) => 0
(2, 1, 1) => 0
(2, 1, 2) => 0
(2, 1, 3) => -1
(2, 2, 1) => 0
(2, 2, 2) => 0
(2, 2, 3) => 0
(2, 3, 1) => 1
(2, 3, 2) => 0
(2, 3, 3) => 0
(3, 1, 1) => 0
(3, 1, 2) => 1
(3, 1, 3) => 0
(3, 2, 1) => -1
(3, 2, 2) => 0
(3, 2, 3) => 0
(3, 3, 1) => 0
(3, 3, 2) => 0
(3, 3, 3) => 0
code-golf
permutations
xnor
źródło
źródło
Odpowiedzi:
Galaretka , 5 bajtów
Wypróbuj online!
Algorytm
Rozważmy różnice ji, kj, ik .
Jeśli (i, j, k) jest rotacją (1, 2, 3) , różnice są rotacją (1, 1, -2) . Biorąc sumę znaków, otrzymujemy 1 + 1 + (-1) = 1 .
Jeśli (i, j, k) jest rotacją (3, 2, 1) , różnice są rotacją (-1, -1, 2) . Biorąc sumę znaków, otrzymujemy (-1) + (-1) + 1 = -1 .
Dla (i, i, j) (lub obrotu), gdzie i oraz j mogą być równe, różnice wynoszą (0, ji, ij) . Znaki ji i ij są przeciwne, więc suma znaków wynosi 0 + 0 = 0 .
Kod
źródło
Python 2 , 32 bajty
Wypróbuj online!
Algorytm
Rozważmy różnice ij, jk, ki .
Jeśli (i, j, k) jest rotacją o (1, 2, 3) , różnice są rotacją o (-1, -1, 2) . Biorąc produkt, otrzymujemy (-1) × (-1) × 2 = 2 .
Jeśli (i, j, k) jest rotacją (3, 2, 1) , różnice są rotacją (1, 1, -2) . Biorąc produkt, otrzymujemy 1 × 1 × (-2) = -2 .
Dla (i, i, j) (lub obrotu), gdzie i oraz j mogą być równe, różnice wynoszą (0, ij, ji) . Biorąc produkt, otrzymujemy 0 × (ij) × (ji) = 0 .
Zatem podzielenie iloczynu różnic przez 2 daje pożądany wynik.
źródło
x 86, 15 bajtów
Bierze argumenty
%al
,%dl
,%bl
, powraca w%al
. Prosta implementacja z wykorzystaniem formuły Dennisa.Poza tym: myślę, że rozumiem, dlaczego teraz
%eax
jest „akumulator” ...źródło
sar
nie miałeś na myślishr
.Oktawa, 20 bajtów
Dość bezpośrednie wdrożenie formuły determinującej. Dopuszcza kolumny macierzy tożsamości, a następnie przyjmuje wyznacznik.
źródło
Wolfram Language (Mathematica) , 9 bajtów
Wypróbuj online!
Wolfram Language (Mathematica) , 18 bajtów
Zaoszczędzono 2 bajty dzięki Martinowi Enderowi.
Wypróbuj online!
źródło
Det@IdentityMatrix[3][[#]]&
(dłuższe, ale mniej tokenów).#^1
jest po prostu#
;)Haskell , 26 bajtów
Wypróbuj online!
Nasty IEEE unosi ...
źródło
JavaScript (ES6), 38 bajtów
Zbyt skomplikowane, ale zabawne:
Wypróbuj online!
JavaScript (ES6), 28 bajtów
Używając standardowej formuły:
Wypróbuj online!
źródło
05AB1E ,
75 bajtów1 bajt zapisany dzięki @Emigna
Wypróbuj online!
źródło
Ć
zamiast4∍
zapisuje bajt.APL (Dyalog) ,
119 bajtów2 bajty zapisane dzięki @ngn
Wypróbuj online!
źródło
+/×2-/4⍴⎕
Rubinowy , 28 bajtów
Wypróbuj online!
źródło
CJam (16 bajtów)
Demo online . Zauważ, że jest to oparte na mojej poprzedniej odpowiedzi, która wykorzystuje symbol Levi-Civita do obliczenia symbolu Jacobi.
źródło
Rubinowy , 56 bajtów
Wypróbuj online!
Gdy wykluczymy przypadki, w których wartości trojaczki nie są unikalne,
t.sort
jest to równoważne (i krótsze niż)[1,2,3]
lub[*1..3]
źródło
Łuska , 7 bajtów
Wypróbuj online!
Wyjaśnienie
Prosty port galaretki Dennisa .
S:←
kopiuje nagłówek listy do końca,Ẋ-
bierze sąsiednie różnice,ṁ±
pobiera znak każdego elementu i sumuje wynik.źródło
Galaretki , 8 bajtów
Wypróbuj online!
Wydaje się zbyt niezamieszkany. :(
źródło
Dodaj ++ , 13 bajtów
Wypróbuj online!
źródło
SHELL , 44 bajtów
testy:
Objaśnienie:
BC , 42 bajty
testy:
źródło
bc
aby uniknąć dodatkowej deklaracji wywołania / funkcji?Stax , 8 bajtów
Uruchom i debuguj
Przekłada się na
-(b-a)(c-b)(a-c)/2
.źródło
J , 12 bajtów
Wypróbuj online!
Bezpośrednie tłumaczenie rozwiązania APL Uriela na J.
Wyjaśnienie:
4$]
Rozszerza listę o pierwszy element2 /\
wykonaj następujące czynności dla wszystkich nakładających się par na liście:*@-
znajdź znak ich różnicy1#.
dodaćźródło
(-/ .*)@:(^&(i.3)"0)%2:
Japt , 7 bajtów
Spróbuj
Wyjaśnienie
Alternatywny
Pobiera dane wejściowe jako indywidualne liczby całkowite.
Spróbuj
źródło
Java 8, 28 bajtów
Port odpowiedzi @Dennis na Python 2 .
Wypróbuj online.
źródło
Python , 33 bajty
Wypróbuj online!
Przez jakiś czas próbowałem pokonać podejście oparte na iloczynie różnic , ale najlepsze, co dostałem, to 1 bajt dłużej.
źródło