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

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.

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.


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


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.









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
}




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

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


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



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.