Símbolo de Levi-Civita

29

El símbolo tridimensional de Levi-Civita es una función que ftoma triples números (i,j,k)cada uno {1,2,3}, en {-1,0,1}, definido como:

  • f(i,j,k) = 0cuando i,j,kno son distintos, es decir, i=jo j=kok=i
  • f(i,j,k) = 1cuando (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) = -1cuando (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,3con 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
xnor
fuente
2
Relacionado.
Martin Ender

Respuestas:

20

Jalea , 5 bytes

ṁ4IṠS

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

ṁ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.
Dennis
fuente
Hermoso: seguramente este era el algoritmo previsto de xnor.
ETHproductions
8

Python 2 , 32 bytes

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

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.

Dennis
fuente
7

x86, 15 bytes

Toma argumentos en %al, %dl, %bl, regresa en %al. Implementación sencilla utilizando la fórmula 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 

Aparte: creo que entiendo por qué %eaxes el "acumulador" ahora ...

qwr
fuente
Creo que quisiste decir que sarno shr.
Jester
@Jester buena captura. arreglado
qwr
6

Octava, 20 bytes

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

Implementación bastante directa de la fórmula determinante. Permuta las columnas de la matriz de identidad y luego toma el determinante.

Nick Alger
fuente
4

JavaScript (ES6), 38 bytes

Demasiado complicado pero divertido:

(a,b,c,k=(a+b*7+c*13)%18)=>k-12?+!k:-1

Pruébalo en línea!


JavaScript (ES6), 28 bytes

Usando la fórmula estándar:

(a,b,c)=>(a-b)*(b-c)*(c-a)/2

Pruébalo en línea!

Arnauld
fuente
1

Ruby , 56 bytes

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

Pruébalo en línea!

Una vez que descartamos casos donde los valores del triplete no son únicos, t.sortes equivalente a (y más corto que) [1,2,3]o[*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
}
benj2240
fuente
1

Casco , 7 bytes

ṁ±Ẋ-S:←

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.

Sophia Lechner
fuente
0

SHELL , 44 Bytes

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

pruebas:

 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

Explicacion:

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

BC , 42 Bytes

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

pruebas:

 f(3,2,1)
 -1
 f(1,2,3)
 1
 f(1,2,1)
 0
Ali ISSA
fuente
1
¿Es posible reclamar el idioma bcpara evitar la declaración de llamada / función extraña?
caird coinheringaahing
1
¿En qué capa funciona esto?
Dennis
0

J , 12 bytes

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

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 diferencia

1#. agregar

Galen Ivanov
fuente
1
Dejaré esta solución basada en el determinante de Vandermonde aquí como comentario en caso de que alguien pueda descubrir cómo jugarlo:(-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller el
0

Japt , 7 bytes

änUÌ xg

Intentalo


Explicación

            :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

Alternativa

Toma datos como enteros individuales.

NänW ×z

Intentalo

Lanudo
fuente