Symbol Levi-Civita


29

Trójwymiarowy Levi Civita symbol funkcji fprzy 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) = 0kiedy i,j,knie są odrębne, tj. i=jlub j=klubk=i
  • f(i,j,k) = 1kiedy (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) = -1kiedy (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,3z 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

Odpowiedzi:


20

Galaretka , 5 bajtów

ṁ4IṠS

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

ṁ4IṠS  Main link. Argument: [i, j, k]

ṁ4     Mold 4; yield [i, j, k, i].
  I    Increments; yield [j-i, k-j, i-k].
   Ṡ   Take the signs, replacing 2 and -2 with 1 and -1 (resp.).
    S  Take the sum.

Piękny - z pewnością był to zamierzony algorytm Xnora.
ETHprodukcje

8

Python 2 , 32 bajty

lambda i,j,k:(i-j)*(j-k)*(k-i)/2

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.


7

x 86, 15 bajtów

Bierze argumenty %al, %dl, %bl, powraca w %al. Prosta implementacja z wykorzystaniem formuły Dennisa.

 6: 88 c1                   mov    %al,%cl
 8: 28 d0                   sub    %dl,%al
 a: 28 da                   sub    %bl,%dl
 c: 28 cb                   sub    %cl,%bl
 e: f6 e3                   mul    %bl
10: f6 e2                   mul    %dl
12: d0 f8                   sar    %al
14: c3                      retq 

Poza tym: myślę, że rozumiem, dlaczego teraz %eaxjest „akumulator” ...


Myślę, że sarnie miałeś na myśli shr.
Jester

@Jester dobry połów. naprawiono
qwr

6

Oktawa, 20 bajtów

@(v)det(eye(3)(:,v))

Dość bezpośrednie wdrożenie formuły determinującej. Dopuszcza kolumny macierzy tożsamości, a następnie przyjmuje wyznacznik.









1

Rubinowy , 56 bajtów

->t{t.uniq!? 0:(0..2).any?{|r|t.sort==t.rotate(r)}?1:-1}

Wypróbuj online!

Gdy wykluczymy przypadki, w których wartości trojaczki nie są unikalne, t.sortjest to równoważne (i krótsze niż) [1,2,3]lub[*1..3]

->t{
  t.uniq! ? 0                     # If applying uniq modifies the input, return 0
          : (0..2).any?{|r|       # Check r from 0 to 2:
              t.sort==t.rotate(r) #   If rotating the input r times gives [1,2,3],
            } ? 1                 #     return 1;
              :-1                 #     else return -1
}




0

SHELL , 44 bajtów

 F(){ bc<<<\($2-$1\)*\($3-$1\)*\($3-$2\)/2;}

testy:

 F 1 2 3
 1

 F 1 1 2
 0

 F  2 3 1
 1

 F 3 1 2
 1

 F 3 2 1
 -1

 F 2 1 3
 -1

 F 1 3 2
 -1

 F 1 3 1
 0

Objaśnienie:

 The formula is : ((j - i)*(k - i)*(k - j))/2

BC , 42 bajty

 define f(i,j,k){return(j-i)*(k-i)*(k-j)/2}

testy:

 f(3,2,1)
 -1
 f(1,2,3)
 1
 f(1,2,1)
 0

1
Czy można po prostu zażądać języka, bcaby uniknąć dodatkowej deklaracji wywołania / funkcji?
caird coinheringaahing

1
W jakiej powłoce to działa?
Dennis


0

J , 12 bajtów

1#.2*@-/\4$]

Wypróbuj online!

Bezpośrednie tłumaczenie rozwiązania APL Uriela na J.

Wyjaśnienie:

4$] Rozszerza listę o pierwszy element

2 /\ wykonaj następujące czynności dla wszystkich nakładających się par na liście:

*@- znajdź znak ich różnicy

1#. dodać


1
Zostawię to rozwiązanie oparte na determinantach Vandermonde tutaj jako komentarz na wypadek, gdyby ktoś mógł wymyślić, jak (-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller

0

Japt , 7 bajtów

änUÌ xg

Spróbuj


Wyjaśnienie

            :Implicit input of array U
ä           :Get each consecutive pair of elements
 n          :Reduce by subtracting the first from the last
  UÌ        :But, before doing that, prepend the last element in U
     g      :Get the signs
    x       :Reduce by addition

Alternatywny

Pobiera dane wejściowe jako indywidualne liczby całkowite.

NänW ×z

Spróbuj



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.