Simbolo Levi-Civita


29

Il simbolo tridimensionale di Levi-Civita è una funzione che fprende triple di numeri (i,j,k)ciascuna in {1,2,3}, a {-1,0,1}, definite come:

  • f(i,j,k) = 0quando i,j,knon sono distinti, ovvero i=jo j=kok=i
  • f(i,j,k) = 1quando (i,j,k)è uno spostamento ciclico di (1,2,3), quello è uno di (1,2,3), (2,3,1), (3,1,2).
  • f(i,j,k) = -1quando (i,j,k)è uno spostamento ciclico di (3,2,1), quello è uno di (3,2,1), (2,1,3), (1,3,2).

Il risultato è il segno di una permutazione di (1,2,3), con non permutazioni che danno 0. In alternativa, se associamo i valori 1,2,3a vettori di base di unità ortogonali e_1, e_2, e_3, allora f(i,j,k)è il determinante della matrice 3x3 con colonne e_i, e_j, e_k.

Ingresso

Tre numeri ciascuno {1,2,3}in ordine. In alternativa, puoi scegliere di utilizzare indicizzato zero {0,1,2}.

Produzione

Il loro valore della funzione Levi-Civita da {-1,0,1}. Questo è il codice golf.

Casi test

Vi sono 27 possibili ingressi.

(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

Risposte:


20

Gelatina , 5 byte

ṁ4IṠS

Provalo online!

Algoritmo

Consideriamo le differenze ji, kj, ik .

  • Se (i, j, k) è una rotazione di (1, 2, 3) , le differenze sono una rotazione di (1, 1, -2) . Prendendo la somma dei segni, otteniamo 1 + 1 + (-1) = 1 .

  • Se (i, j, k) è una rotazione di (3, 2, 1) , le differenze sono una rotazione di (-1, -1, 2) . Prendendo la somma dei segni, otteniamo (-1) + (-1) + 1 = -1 .

  • Per (i, i, j) (o rotazione), dove i e j può essere uguali, le differenze sono (0, ji, ij) . I segni di ji e ij sono opposti, quindi la somma dei segni è 0 + 0 = 0 .

Codice

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

Bello - sicuramente questo era l'algoritmo previsto da xnor.
ETHproductions

8

Python 2 , 32 byte

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

Provalo online!

Algoritmo

Consideriamo le differenze ij, jk, ki .

  • Se (i, j, k) è una rotazione di (1, 2, 3) , le differenze sono una rotazione di (-1, -1, 2) . Prendendo il prodotto, otteniamo (-1) × (-1) × 2 = 2 .

  • Se (i, j, k) è una rotazione di (3, 2, 1) , le differenze sono una rotazione di (1, 1, -2) . Prendendo il prodotto, otteniamo 1 × 1 × (-2) = -2 .

  • Per (i, i, j) (o rotazione), dove i e j può essere uguali, le differenze sono (0, ij, ji) . Prendendo il prodotto, otteniamo 0 × (ij) × (ji) = 0 .

Pertanto, dividendo il prodotto delle differenze per 2 si ottiene il risultato desiderato.


7

x86, 15 byte

Prende argomenti %al, %dl, %bl, ritorna in %al. Implementazione semplice usando la formula di 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 

A parte: penso di capire perché %eaxsia l '"accumulatore" ora ...


Penso che tu sarnon intendessi shr.
Giullare

@Jester buona cattura. risolto
qwr

6

Ottava, 20 byte

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

Implementazione piuttosto diretta della formula determinante. Permette alle colonne della matrice identità quindi prende il determinante.




4

JavaScript (ES6), 38 byte

Troppo complicato ma divertente:

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

Provalo online!


JavaScript (ES6), 28 byte

Utilizzando la formula standard:

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

Provalo online!






1

Rubino , 56 byte

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

Provalo online!

Una volta esclusi i casi in cui i valori della tripletta non sono univoci, t.sortè equivalente a (e più breve di) [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
}

1

Buccia , 7 byte

ṁ±Ẋ-S:←

Provalo online!

Spiegazione

Porto diretto della risposta Jelly di Dennis . S:←copia la fine dell'elenco fino alla fine, Ẋ-prende le differenze adiacenti e ṁ±prende il segno di ciascun elemento e somma il risultato.




0

SHELL , 44 byte

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

test:

 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

Spiegazione :

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

AC , 42 byte

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

test:

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

1
È possibile solo richiedere la lingua bcper evitare la dichiarazione di chiamata / funzione estranea?
caird coinheringaahing

1
In quale shell funziona?
Dennis,


0

J , 12 byte

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

Provalo online!

Traduzione diretta della soluzione APL di Uriel in J.

Spiegazione:

4$] Estende l'elenco con il suo primo elemento

2 /\ procedi come segue per tutte le coppie sovrapposte nell'elenco:

*@- trova il segno della loro differenza

1#. addizionare


1
Lascerò questa soluzione basata su determinante di Vandermonde qui come commento nel caso in cui qualcuno possa capire come giocarla a golf:(-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller

0

Japt , 7 byte

änUÌ xg

Provalo


Spiegazione

            :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

Accetta input come singoli numeri interi.

NänW ×z

Provalo



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.