Le symbole Levi-Civita en trois dimensions est une fonction f
prenant des triplets de nombres (i,j,k)
chacun dans {1,2,3}
, à {-1,0,1}
, défini comme:
f(i,j,k) = 0
lorsqu'ilsi,j,k
ne sont pas distincts, c.i=j
-à- d. ouj=k
ouk=i
f(i,j,k) = 1
quand(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) = -1
quand(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:
Gelée , 5 octets
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
la source
Python 2 , 32 octets
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é.
la source
x86, 15 octets
Prend arguments
%al
,%dl
,%bl
, les retours dans%al
. Implémentation simple en utilisant la formule de Dennis.A part: je pense que je comprends pourquoi
%eax
est "l'accumulateur" maintenant ...la source
sar
ne voulais passhr
.Octave, 20 octets
Mise en œuvre assez directe de la formule déterminante. Permute les colonnes de la matrice d'identité puis prend le déterminant.
la source
Wolfram Language (Mathematica) , 9 octets
Essayez-le en ligne!
Wolfram Language (Mathematica) , 18 octets
Enregistré 2 octets grâce à Martin Ender.
Essayez-le en ligne!
la source
Det@IdentityMatrix[3][[#]]&
(plus, mais moins de jetons).#^1
est juste#
;)Haskell , 26 octets
Essayez-le en ligne!
Nasty IEEE flotte ...
la source
JavaScript (ES6), 38 octets
Trop compliqué mais amusant:
Essayez-le en ligne!
JavaScript (ES6), 28 octets
En utilisant la formule standard:
Essayez-le en ligne!
la source
05AB1E ,
75 octets1 octet enregistré grâce à @Emigna
Essayez-le en ligne!
la source
Ć
au lieu d'4∍
enregistrer un octet.APL (Dyalog) ,
119 octets2 octets enregistrés grâce à @ngn
Essayez-le en ligne!
la source
+/×2-/4⍴⎕
Rubis , 28 octets
Essayez-le en ligne!
la source
CJam (16 octets)
Démo en ligne . Notez que cela est basé sur une réponse précédente de la mienne qui utilise le symbole Levi-Civita pour calculer le symbole Jacobi.
la source
Rubis , 56 octets
Essayez-le en ligne!
Une fois que nous excluons les cas où les valeurs du triplet ne sont pas uniques,
t.sort
est équivalent à (et plus court que)[1,2,3]
ou[*1..3]
la source
Husk , 7 octets
Essayez-le en ligne!
Explication
Port droit de la réponse de Dennis's Jelly .
S:←
copie la tête de liste à la fin,Ẋ-
prend les différences adjacentes,ṁ±
prend le signe de chaque élément et additionne le résultat.la source
Gelée , 8 octets
Essayez-le en ligne!
Semble trop non golfé. :(
la source
Ajouter ++ , 13 octets
Essayez-le en ligne!
la source
SHELL , 44 octets
tests:
Explication:
BC , 42 octets
tests:
la source
bc
pour éviter la déclaration d'appel / fonction superflue?Stax , 8 octets
Exécuter et déboguer
Traduit en
-(b-a)(c-b)(a-c)/2
.la source
J , 12 octets
Essayez-le en ligne!
Traduction directe de la solution APL d'Uriel en J.
Explication:
4$]
Prolonge la liste avec son premier élément2 /\
procédez comme suit pour toutes les paires qui se chevauchent dans la liste:*@-
trouver le signe de leur différence1#.
additionnerla source
(-/ .*)@:(^&(i.3)"0)%2:
Japt , 7 octets
Essayez-le
Explication
Alternative
Prend l'entrée sous forme d'entiers individuels.
Essayez-le
la source
Java 8, 28 octets
Réponse de Python 2 du port de @Dennis .
Essayez-le en ligne.
la source
Python , 33 octets
Essayez-le en ligne!
J'ai essayé pendant un certain temps de battre l' approche du produit des différences , mais le meilleur que j'ai obtenu était de 1 octet de plus.
la source