Símbolo Levi-Civita


29

O símbolo tridimensional de Levi-Civita é uma função que fleva triplos de números (i,j,k)cada um {1,2,3}, para {-1,0,1}, definido como:

  • f(i,j,k) = 0quando i,j,knão são distintos, ie i=jou j=kouk=i
  • f(i,j,k) = 1Quando (i,j,k)é uma mudança cíclica de (1,2,3), essa é uma das (1,2,3), (2,3,1), (3,1,2).
  • f(i,j,k) = -1Quando (i,j,k)é uma mudança cíclica de (3,2,1), essa é uma das (3,2,1), (2,1,3), (1,3,2).

O resultado é o sinal de uma permutação de (1,2,3), com não permutações dando 0. Alternativamente, se associarmos os valores 1,2,3aos vetores de base unitários ortogonais e_1, e_2, e_3, então f(i,j,k)é o determinante da matriz 3x3 com colunas e_i, e_j, e_k.

Entrada

Três números cada {1,2,3}em ordem. Ou você pode optar por usar o índice zero {0,1,2}.

Saída

O valor da função Levi-Civita de {-1,0,1}. Isso é código de golfe.

Casos de teste

Existem 27 entradas possíveis.

(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

Respostas:


20

Gelatina , 5 bytes

ṁ4IṠS

Experimente online!

Algoritmo

Vamos considerar as diferenças ji, kj, ik .

  • Se (i, j, k) é uma rotação de (1, 2, 3) , as diferenças são uma rotação de (1, 1, -2) . Tomando a soma dos sinais, obtemos 1 + 1 + (-1) = 1 .

  • Se (i, j, k) é uma rotação de (3, 2, 1) , as diferenças são uma rotação de (-1, -1, 2) . Tomando a soma dos sinais, obtemos (-1) + (-1) + 1 = -1 .

  • Para (i, i, j) (ou uma rotao), em que i e j podem ser iguais, as diferenças são (0, ji, ij) . Os sinais de ji e ij são opostos, então a soma dos sinais é 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.

Bonito - certamente esse era o algoritmo pretendido pelo xnor.
ETHproductions

8

Python 2 , 32 bytes

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

Experimente online!

Algoritmo

Vamos considerar as diferenças ij, jk, ki .

  • Se (i, j, k) é uma rotação de (1, 2, 3) , as diferenças são uma rotação de (-1, -1, 2) . Tomando o produto, obtemos (-1) × (-1) × 2 = 2 .

  • Se (i, j, k) é uma rotação de (3, 2, 1) , as diferenças são uma rotação de (1, 1, -2) . Tomando o produto, obtemos 1 × 1 × (-2) = -2 .

  • Para (i, i, j) (ou uma rotao), em que i e j podem ser iguais, as diferenças são (0, ij, ji) . Tomando o produto, obtemos 0 × (ij) × (ji) = 0 .

Assim, dividir o produto das diferenças por 2 produz o resultado desejado.


7

x86, 15 bytes

Toma argumentos %al, %dl, %bl, retorna em %al. Implementação direta usando a 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 

Além: acho que entendo por que %eaxo "acumulador" agora ...


Eu acho que você sarnão quis dizer shr.
Jester

@ Jester boa captura. corrigido
qwr 28/03/19

6

Oitava, 20 bytes

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

Implementação bastante direta da fórmula determinante. Permite que as colunas da matriz de identidade tomem o determinante.









1

Ruby , 56 bytes

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

Experimente online!

Uma vez excluídos os casos em que os valores do trigêmeo não são únicos, t.sorté equivalente a (e menor 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 Bytes

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

testes:

 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

Explicação:

 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}

testes:

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

11
É possível apenas reivindicar o idioma bcpara evitar a declaração de chamada / função estranha?
caird coinheringaahing

11
Em qual shell isso funciona?
Dennis


0

J , 12 bytes

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

Experimente online!

Tradução direta da solução APL de Uriel para J.

Explicação:

4$] Estende a lista com seu primeiro item

2 /\ faça o seguinte para todos os pares sobrepostos na lista:

*@- encontre o sinal da diferença

1#. adicionar


11
Vou deixar essa solução baseada em determinante de Vandermonde aqui como um comentário, caso alguém possa descobrir como jogar golfe:(-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller

0

Japonês , 7 bytes

änUÌ xg

Tente


Explicação

            :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

Alternativo

Recebe entrada como números inteiros individuais.

NänW ×z

Tente



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.