El símbolo tridimensional de Levi-Civita es una función que f
toma triples números (i,j,k)
cada uno {1,2,3}
, en {-1,0,1}
, definido como:
f(i,j,k) = 0
cuandoi,j,k
no son distintos, es decir,i=j
oj=k
ok=i
f(i,j,k) = 1
cuando(i,j,k)
es un cambio cíclico de(1,2,3)
, ese es uno de(1,2,3), (2,3,1), (3,1,2)
.f(i,j,k) = -1
cuando(i,j,k)
es un cambio cíclico de(3,2,1)
, ese es uno de(3,2,1), (2,1,3), (1,3,2)
.
El resultado es el signo de una permutación de (1,2,3)
, con no permutaciones dando 0. Alternativamente, si asociamos los valores 1,2,3
con vectores de base de unidades ortogonales e_1, e_2, e_3
, entonces f(i,j,k)
es el determinante de la matriz 3x3 con columnas e_i, e_j, e_k
.
Entrada
Tres números cada uno {1,2,3}
en orden. O bien, puede optar por usar indexado a cero {0,1,2}
.
Salida
Su valor de función Levi-Civita de {-1,0,1}
. Este es el código de golf.
Casos de prueba
Hay 27 entradas posibles.
(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
fuente
fuente
Respuestas:
Jalea , 5 bytes
Pruébalo en línea!
Algoritmo
Consideremos las diferencias ji, kj, ik .
Si (i, j, k) es una rotación de (1, 2, 3) , las diferencias son una rotación de (1, 1, -2) . Tomando la suma de los signos, obtenemos 1 + 1 + (-1) = 1 .
Si (i, j, k) es una rotación de (3, 2, 1) , las diferencias son una rotación de (-1, -1, 2) . Tomando la suma de los signos, obtenemos (-1) + (-1) + 1 = -1 .
Para (i, i, j) (o una rotación), donde i y j pueden ser iguales, las diferencias son (0, ji, ij) . Los signos de ji e ij son opuestos, por lo que la suma de los signos es 0 + 0 = 0 .
Código
fuente
Python 2 , 32 bytes
Pruébalo en línea!
Algoritmo
Consideremos las diferencias ij, jk, ki .
Si (i, j, k) es una rotación de (1, 2, 3) , las diferencias son una rotación de (-1, -1, 2) . Tomando el producto, obtenemos (-1) × (-1) × 2 = 2 .
Si (i, j, k) es una rotación de (3, 2, 1) , las diferencias son una rotación de (1, 1, -2) . Tomando el producto, obtenemos 1 × 1 × (-2) = -2 .
Para (i, i, j) (o una rotación), donde i y j pueden ser iguales, las diferencias son (0, ij, ji) . Tomando el producto, obtenemos 0 × (ij) × (ji) = 0 .
Por lo tanto, dividir el producto de las diferencias entre 2 produce el resultado deseado.
fuente
x86, 15 bytes
Toma argumentos en
%al
,%dl
,%bl
, regresa en%al
. Implementación sencilla utilizando la fórmula de Dennis.Aparte: creo que entiendo por qué
%eax
es el "acumulador" ahora ...fuente
sar
noshr
.Octava, 20 bytes
Implementación bastante directa de la fórmula determinante. Permuta las columnas de la matriz de identidad y luego toma el determinante.
fuente
Wolfram Language (Mathematica) , 9 bytes
Pruébalo en línea!
Wolfram Language (Mathematica) , 18 bytes
Guardado 2 bytes gracias a Martin Ender.
Pruébalo en línea!
fuente
Det@IdentityMatrix[3][[#]]&
(más tiempo, pero menos tokens).#^1
es justo#
;)Haskell , 26 bytes
Pruébalo en línea!
Flotadores desagradables de IEEE ...
fuente
JavaScript (ES6), 38 bytes
Demasiado complicado pero divertido:
Pruébalo en línea!
JavaScript (ES6), 28 bytes
Usando la fórmula estándar:
Pruébalo en línea!
fuente
05AB1E ,
75 bytes1 byte guardado gracias a @Emigna
Pruébalo en línea!
fuente
Ć
en lugar de4∍
guardar un byte.APL (Dyalog) ,
119 bytes2 bytes guardados gracias a @ngn
Pruébalo en línea!
fuente
+/×2-/4⍴⎕
Rubí , 28 bytes.
Pruébalo en línea!
fuente
CJam (16 bytes)
Demo en línea . Tenga en cuenta que esto se basa en una respuesta anterior mía que utiliza el símbolo de Levi-Civita para calcular el símbolo de Jacobi.
fuente
Ruby , 56 bytes
Pruébalo en línea!
Una vez que descartamos casos donde los valores del triplete no son únicos,
t.sort
es equivalente a (y más corto que)[1,2,3]
o[*1..3]
fuente
Casco , 7 bytes
Pruébalo en línea!
Explicación
El puerto directo de Dennis's Jelly responde .
S:←
copia el encabezado de la lista hasta el final,Ẋ-
toma las diferencias adyacentes,ṁ±
toma el signo de cada elemento y suma el resultado.fuente
Jalea , 8 bytes
Pruébalo en línea!
Parece muy poco golfista. :(
fuente
Agregar ++ , 13 bytes
Pruébalo en línea!
fuente
SHELL , 44 Bytes
pruebas:
Explicacion:
BC , 42 Bytes
pruebas:
fuente
bc
para evitar la declaración de llamada / función extraña?Stax , 8 bytes
Ejecutar y depurarlo
Se traduce a
-(b-a)(c-b)(a-c)/2
.fuente
J , 12 bytes
Pruébalo en línea!
Traducción directa de la solución APL de Uriel a J.
Explicación:
4$]
Extiende la lista con su primer elemento.2 /\
haga lo siguiente para todos los pares superpuestos en la lista:*@-
encuentra el signo de su diferencia1#.
agregarfuente
(-/ .*)@:(^&(i.3)"0)%2:
Japt , 7 bytes
Intentalo
Explicación
Alternativa
Toma datos como enteros individuales.
Intentalo
fuente
Java 8, 28 bytes
Puerto de @Dennis 'Python 2 respuesta .
Pruébalo en línea.
fuente
Python , 33 bytes
Pruébalo en línea!
Intenté por un tiempo superar el enfoque del producto de las diferencias , pero lo mejor que obtuve fue 1 byte más.
fuente