Levi-Civita sembolü


29

Üç boyutlu Levi-Civita sembolü bir fonksiyonudur fsayı üçlü alarak (i,j,k)her bir in {1,2,3}, için {-1,0,1}, aşağıdaki şekilde tanımlanmıştır:

  • f(i,j,k) = 0zaman i,j,kbelirgin değildir, yani i=jya da j=kya dak=i
  • f(i,j,k) = 1ne zaman (i,j,k)bir çevrimsel kaydırma olan (1,2,3)biridir (1,2,3), (2,3,1), (3,1,2).
  • f(i,j,k) = -1ne zaman (i,j,k)bir çevrimsel kaydırma olan (3,2,1)biridir (3,2,1), (2,1,3), (1,3,2).

Sonucudur işareti bir permütasyon (1,2,3)biz değerleri ilişkilendirmek halinde olmayan permütasyon, alternatif olarak 0 değerini veren, 1,2,3ortogonal birimlerine göre vektörler ile e_1, e_2, e_3, daha sonra f(i,j,k)bir belirleyici sütunlu 3x3 matris e_i, e_j, e_k.

Giriş

Sırasıyla her biri üç numara {1,2,3}. Veya, sıfır dizinli kullanmayı tercih edebilirsiniz {0,1,2}.

Çıktı

Onların Levi-Civita işlevi değeri {-1,0,1}. Bu kod golfü.

Test durumları

27 olası giriş vardır.

(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

Yanıtlar:


20

Jöle , 5 bayt

ṁ4IṠS

Çevrimiçi deneyin!

Algoritma

Ji, kj, ik farklarını göz önüne alalım .

  • Eğer (i, j, k) bir rotasyonu olduğu yerde (1, 2, 3) , fark bir rotasyonu (1, 1, -2) . İşaretlerin toplamını alarak 1 + 1 + (-1) = 1 değerini alırız .

  • Eğer (i, j, k) bir rotasyonu olduğu yerde (3, 2, 1) , fark bir rotasyonu (-1, -1, 2) . İşaretlerin toplamını alarak, (-1) + (-1) + 1 = -1 elde ederiz .

  • İçin (i, i, j) (ya da bir döndürme), i ve j, eşit olabilir, farklar (0, ji ij) . Belirtileri ji ve ij işaretleri toplamı yani, zıt 0 + 0 = 0 .

kod

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

Güzel - elbette bu xnor'ın tasarladığı algoritmaydı.
ETHproductions

8

Python 2,32 bayt

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

Çevrimiçi deneyin!

Algoritma

Farklılıkları düşünelim ij, jk, ki .

  • Eğer (i, j, k) bir rotasyonu olduğu yerde (1, 2, 3) , fark bir rotasyonu (-1, -1, 2) . Ürünü alarak, (-1) × (-1) × 2 = 2 elde ediyoruz .

  • Eğer (i, j, k) bir rotasyonu olduğu yerde (3, 2, 1) , fark bir rotasyonu (1, 1, -2) . Ürünü alarak, 1 × 1 × (-2) = -2 elde ederiz .

  • İçin (i, i, j) (ya da bir döndürme), i ve j, eşit olabilir, farklar (0, ij ji) . Ürünü alırsak, 0 × (ij) × (ji) = 0 olur .

Böylece, farklılıkların ürününü 2'ye bölmek istenen sonucu verir.


7

x86, 15 bayt

Bağımsız değişkenleri alır %al, %dl, %bl, içinde döner %al. Dennis'in formülünü kullanarak basit uygulama.

 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 

Bir kenara: Sanırım neden %eaxşimdi "akümülatör" ...


Sanırım demek saristemedin shr.
Jester

@Jester iyi yakalamak. sabit
qwr

6

Oktav, 20 bayt

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

Belirleyici formülün oldukça doğrudan uygulanması. Kimlik matrisinin sütunlarına izin verir, sonra determinantı alır.









1

Ruby , 56 bayt

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

Çevrimiçi deneyin!

Üçüzün değerlerinin benzersiz olmadığı durumları ekarte ettikten sonra t.sort, eşdeğerdir (ve bundan daha kısadır) [1,2,3]veya[*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

KABUK , 44 Bayt

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

testler:

 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

Açıklama:

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

BC , 42 Bayt

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

testler:

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

1
Dili sadece bcyabancı çağrı / işlev bildiriminden kaçınmak için talep etmek mümkün mü ?
caird coinheringaahing

1
Bu hangi kabukta çalışıyor?
Dennis,


0

J , 12 bayt

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

Çevrimiçi deneyin!

Uriel'in APL çözümünün J'ye doğrudan çevirisi

Açıklama:

4$] Listeyi ilk öğesiyle genişletir

2 /\ Listedeki tüm çakışan çiftler için aşağıdakini yapın:

*@- farklılıklarının işaretini bul

1#. eklemek


1
Bu Vandermonde-determinant-bazlı çözümü, birinin nasıl golf (-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller

0

Japt , 7 bayt

änUÌ xg

Dene


açıklama

            :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

Alternatif

Bireysel tamsayılar olarak girdi alır.

NänW ×z

Dene



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.