Levi-Civita-Symbol


29

Das dreidimensionale Levi-Civita-Symbol ist eine Funktion, fdie Dreifachzahlen (i,j,k)in {1,2,3}, bis {-1,0,1}, definiert als:

  • f(i,j,k) = 0wenn i,j,knicht verschieden sind, dh i=joder j=koderk=i
  • f(i,j,k) = 1Wann (i,j,k)ist eine zyklische Verschiebung von (1,2,3), das ist eine von (1,2,3), (2,3,1), (3,1,2).
  • f(i,j,k) = -1Wann (i,j,k)ist eine zyklische Verschiebung von (3,2,1), das ist eine von (3,2,1), (2,1,3), (1,3,2).

Das Ergebnis ist das Vorzeichen einer Permutation von (1,2,3), wobei Nicht-Permutationen 0 ergeben. Wenn wir alternativ die Werte 1,2,3orthogonalen Einheitsbasisvektoren zuordnen e_1, e_2, e_3, f(i,j,k)ist dies die Determinante der 3 × 3-Matrix mit Spalten e_i, e_j, e_k.

Eingang

Jeweils drei Nummern {1,2,3}in der Reihenfolge. Alternativ können Sie auch mit einem Index von Null arbeiten {0,1,2}.

Ausgabe

Ihr Levi-Civita-Funktionswert von {-1,0,1}. Das ist Code Golf.

Testfälle

Es gibt 27 mögliche Eingaben.

(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

Antworten:


20

Gelee , 5 Bytes

ṁ4IṠS

Probieren Sie es online!

Algorithmus

Betrachten wir die Unterschiede ji, kj, ik .

  • Wenn (i, j, k) eine Drehung von (1, 2, 3) ist , sind die Differenzen eine Drehung von (1, 1, -2) . Aus der Summe der Zeichen ergibt sich 1 + 1 + (-1) = 1 .

  • Wenn (i, j, k) eine Drehung von (3, 2, 1) ist , sind die Differenzen eine Drehung von (-1, -1, 2) . Nimmt man die Summe der Zeichen, so erhält man (-1) + (-1) + 1 = -1 .

  • Für (i, i, j) (oder eine Drehung), bei der i und j gleich sein können, sind die Differenzen (0, ji, ij) . Die Vorzeichen von ji und ij sind entgegengesetzt, sodass die Summe der Vorzeichen 0 + 0 = 0 ist .

Code

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

Wunderschön - das war sicherlich der von xnor vorgesehene Algorithmus.
ETHproductions

8

Python 2 , 32 Bytes

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

Probieren Sie es online!

Algorithmus

Betrachten wir die Unterschiede ij, jk, ki .

  • Wenn (i, j, k) eine Drehung von (1, 2, 3) ist , sind die Differenzen eine Drehung von (-1, -1, 2) . Nimmt man das Produkt, so erhält man (-1) × (-1) × 2 = 2 .

  • Wenn (i, j, k) eine Drehung von (3, 2, 1) ist , sind die Differenzen eine Drehung von (1, 1, -2) . Nimmt man das Produkt, so erhält man 1 × 1 × (-2) = -2 .

  • Für (i, i, j) (oder eine Drehung), bei der i und j gleich sein können, sind die Differenzen (0, ij, ji) . Nimmt man das Produkt, so erhält man 0 × (ij) × (ji) = 0 .

Wenn man also das Produkt der Differenzen durch 2 dividiert, erhält man das gewünschte Ergebnis.


7

x 86, 15 Bytes

Nimmt Argumente %al, %dl, %bl, kehrt in %al. Einfache Implementierung nach Dennis 'Formel.

 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 

Nebenbei: Ich glaube ich verstehe %eaxjetzt warum der "Akku" ist ...


Ich denke du meintest es sarnicht shr.
Jester

@ Narr guten Fang. fixed
qwr

6

Oktave, 20 Bytes

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

Ziemlich direkte Umsetzung der Determinantenformel. Permutiert die Spalten der Identitätsmatrix, dann übernimmt die Determinante.









1

Ruby , 56 Bytes

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

Probieren Sie es online!

Wenn wir Fälle ausschließen, in denen die Werte des Tripletts nicht eindeutig sind, t.sortist dies gleichbedeutend mit (und kürzer als) [1,2,3]oder[*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;}

Tests:

 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

Erklärung:

 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}

Tests:

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

1
Ist es möglich, nur die Sprache zu beanspruchen bc, um die fremde Aufruf- / Funktionsdeklaration zu vermeiden?
Caird Coinheringaahing

1
In welcher Shell funktioniert das?
Dennis


0

J , 12 Bytes

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

Probieren Sie es online!

Direkte Übersetzung von Uriels APL-Lösung in J.

Erläuterung:

4$] Erweitert die Liste um den ersten Eintrag

2 /\ Führen Sie für alle überlappenden Paare in der Liste die folgenden Schritte aus:

*@- finde das Zeichen ihres Unterschieds

1#. addieren


1
Ich werde diese Vandermonde-determinantenbasierte Lösung hier als Kommentar belassen, falls jemand herausfinden kann, wie man Golf spielt:(-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller

0

Japt , 7 Bytes

änUÌ xg

Versuch es


Erläuterung

            :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

Alternative

Übernimmt die Eingabe als einzelne Ganzzahlen.

NänW ×z

Versuch es



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.