Symbole Levi-Civita


29

Le symbole Levi-Civita en trois dimensions est une fonction fprenant des triplets de nombres (i,j,k)chacun dans {1,2,3}, à {-1,0,1}, défini comme:

  • f(i,j,k) = 0lorsqu'ils i,j,kne sont pas distincts, c. i=j-à- d. ou j=kouk=i
  • f(i,j,k) = 1quand (i,j,k)est un changement cyclique de (1,2,3), c'est l'un des (1,2,3), (2,3,1), (3,1,2).
  • f(i,j,k) = -1quand (i,j,k)est un changement cyclique de (3,2,1), c'est l'un des (3,2,1), (2,1,3), (1,3,2).

Le résultat est le signe d'une permutation de (1,2,3), avec des non-permutations donnant 0. Alternativement, si nous associons les valeurs 1,2,3à des vecteurs de base d'unité orthogonale e_1, e_2, e_3, alors f(i,j,k)est le déterminant de la matrice 3x3 avec des colonnes e_i, e_j, e_k.

Contribution

Trois numéros chacun {1,2,3}dans l'ordre. Ou, vous pouvez choisir d'utiliser l'index zéro {0,1,2}.

Sortie

Leur valeur de fonction Levi-Civita de {-1,0,1}. C'est le golf de code.

Cas de test

Il y a 27 entrées possibles.

(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

Réponses:


20

Gelée , 5 octets

ṁ4IṠS

Essayez-le en ligne!

Algorithme

Considérons les différences ji, kj, ik .

  • Si (i, j, k) est une rotation de (1, 2, 3) , les différences sont une rotation de (1, 1, -2) . En prenant la somme des signes, nous obtenons 1 + 1 + (-1) = 1 .

  • Si (i, j, k) est une rotation de (3, 2, 1) , les différences sont une rotation de (-1, -1, 2) . En prenant la somme des signes, nous obtenons (-1) + (-1) + 1 = -1 .

  • Pour (i, i, j) (ou une rotation), où i et j peuvent être égaux, les différences sont (0, ji, ij) . Les signes de ji et ij sont opposés, donc la somme des signes est 0 + 0 = 0 .

Code

ṁ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.

Magnifique - c'était sûrement l'algorithme prévu par xnor.
ETHproductions

8

Python 2 , 32 octets

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

Essayez-le en ligne!

Algorithme

Considérons les différences ij, jk, ki .

  • Si (i, j, k) est une rotation de (1, 2, 3) , les différences sont une rotation de (-1, -1, 2) . En prenant le produit, nous obtenons (-1) × (-1) × 2 = 2 .

  • Si (i, j, k) est une rotation de (3, 2, 1) , les différences sont une rotation de (1, 1, -2) . En prenant le produit, nous obtenons 1 × 1 × (-2) = -2 .

  • Pour (i, i, j) (ou une rotation), où i et j peuvent être égaux, les différences sont (0, ij, ji) . En prenant le produit, nous obtenons 0 × (ij) × (ji) = 0 .

Ainsi, la division du produit des différences par 2 donne le résultat souhaité.


7

x86, 15 octets

Prend arguments %al, %dl, %bl, les retours dans %al. Implémentation simple en utilisant la formule de Dennis.

 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 

A part: je pense que je comprends pourquoi %eaxest "l'accumulateur" maintenant ...


Je pense que tu sarne voulais pas shr.
Jester

@Jester bonne prise. corrigé
qwr

6

Octave, 20 octets

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

Mise en œuvre assez directe de la formule déterminante. Permute les colonnes de la matrice d'identité puis prend le déterminant.









1

Rubis , 56 octets

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

Essayez-le en ligne!

Une fois que nous excluons les cas où les valeurs du triplet ne sont pas uniques, t.sortest équivalent à (et plus court que) [1,2,3]ou[*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 octets

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

tests:

 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

Explication:

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

BC , 42 octets

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

tests:

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

1
Est-il possible simplement de revendiquer la langue bcpour éviter la déclaration d'appel / fonction superflue?
caird coinheringaahing

1
Dans quelle coquille cela fonctionne-t-il?
Dennis


0

J , 12 octets

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

Essayez-le en ligne!

Traduction directe de la solution APL d'Uriel en J.

Explication:

4$] Prolonge la liste avec son premier élément

2 /\ procédez comme suit pour toutes les paires qui se chevauchent dans la liste:

*@- trouver le signe de leur différence

1#. additionner


1
Je laisse ici cette solution basée sur les déterminants de Vandermonde comme un commentaire au cas où quelqu'un pourrait comprendre comment jouer au golf:(-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller

0

Japt , 7 octets

änUÌ xg

Essayez-le


Explication

            :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

Alternative

Prend l'entrée sous forme d'entiers individuels.

NänW ×z

Essayez-le



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.