Simbol Levi-Civita

29

Simbol Levi-Civita tiga dimensi adalah fungsi yang fmengambil tiga kali lipat dari bilangan (i,j,k)masing-masing dalam {1,2,3}, untuk {-1,0,1}, didefinisikan sebagai:

  • f(i,j,k) = 0ketika i,j,ktidak berbeda, yaitu i=jatau j=katauk=i
  • f(i,j,k) = 1kapan (i,j,k)pergeseran siklik (1,2,3), itu adalah salah satunya (1,2,3), (2,3,1), (3,1,2).
  • f(i,j,k) = -1kapan (i,j,k)pergeseran siklik (3,2,1), itu adalah salah satunya (3,2,1), (2,1,3), (1,3,2).

Hasilnya adalah tanda permutasi dari (1,2,3), dengan non-permutasi memberikan 0. Atau, jika kita mengaitkan nilai-nilai 1,2,3dengan vektor-vektor basis satuan ortogonal e_1, e_2, e_3, maka f(i,j,k)merupakan penentu matriks 3x3 dengan kolom e_i, e_j, e_k.

Memasukkan

Tiga angka masing-masing dari {1,2,3}dalam urutan. Atau, Anda dapat memilih untuk menggunakan indeks-nol {0,1,2}.

Keluaran

Nilai fungsi Levi-Civita dari {-1,0,1}. Ini kode golf.

Uji kasus

Ada 27 input yang mungkin.

(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
Tidak
sumber
2
Terkait
Martin Ender

Jawaban:

20

Jelly , 5 byte

ṁ4IṠS

Cobalah online!

Algoritma

Mari kita perhatikan perbedaannya ji, kj, ik .

  • Jika (i, j, k) adalah rotasi (1, 2, 3) , perbedaannya adalah rotasi (1, 1, -2) . Mengambil jumlah dari tanda-tanda, kita mendapatkan 1 + 1 + (-1) 1 = .

  • Jika (i, j, k) adalah rotasi (3, 2, 1) , perbedaannya adalah rotasi (-1, -1, 2) . Mengambil jumlah dari tanda-tanda, kita mendapatkan (-1) + (-1) + 1 = -1 .

  • Untuk (i, i, j) (atau rotasi), di mana i dan j mungkin sama, perbedaannya adalah (0, ji, ij) . Tanda-tanda ji dan ij berlawanan, jadi jumlah dari tanda-tanda itu adalah 0 + 0 = 0 .

Kode

ṁ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.
Dennis
sumber
Cantik - pasti ini adalah algoritma yang dimaksudkan xnor.
ETHproduk
8

Python 2 , 32 byte

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

Cobalah online!

Algoritma

Mari kita pertimbangkan perbedaan ij, jk, ki .

  • Jika (i, j, k) adalah rotasi (1, 2, 3) , perbedaannya adalah rotasi (-1, -1, 2) . Mengambil produk, kami mendapatkan (-1) × (-1) × 2 = 2 .

  • Jika (i, j, k) adalah rotasi (3, 2, 1) , perbedaannya adalah rotasi (1, 1, -2) . Mengambil produk, kita mendapatkan 1 × 1 × (-2) = -2 .

  • Untuk (i, i, j) (atau rotasi), di mana i dan j mungkin sama, perbedaannya adalah (0, ij, ji) . Mengambil produk, kami mendapatkan 0 × (ij) × (ji) = 0 .

Jadi, membagi produk dari perbedaan dengan 2 menghasilkan hasil yang diinginkan.

Dennis
sumber
7

x86, 15 byte

Mengambil argumen di %al, %dl, %bl, kembali dalam %al. Implementasi langsung menggunakan rumus 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 

Selain itu: Saya pikir saya mengerti mengapa %eax"akumulator" sekarang ...

qwr
sumber
Saya pikir Anda sartidak bermaksud begitu shr.
Jester
@Jester tangkapan yang bagus. diperbaiki
qwr
6

Oktaf, 20 byte

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

Implementasi rumus determinan cukup langsung. Mengijinkan kolom dari matriks identitas kemudian mengambil determinan.

Nick Algeria
sumber
4

Haskell , 26 byte

(x#y)z=(x-y)*(y-z)*(z-x)/2

Cobalah online!

IEEE jahat mengapung ...

benar-benar manusiawi
sumber
4

JavaScript (ES6), 38 byte

Rumit tapi menyenangkan:

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

Cobalah online!


JavaScript (ES6), 28 byte

Menggunakan rumus standar:

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

Cobalah online!

Arnauld
sumber
4

05AB1E , 7 5 byte

1 byte disimpan berkat @Emigna

ĆR¥P;

Cobalah online!

Uriel
sumber
Ćbukannya 4∍menyimpan byte.
Emigna
4

APL (Dyalog) , 11 9 byte

2 byte disimpan berkat @ngn

+/×2-/4⍴⎕

Cobalah online!

Uriel
sumber
sebagai program yang lengkap, ukurannya 9 byte:+/×2-/4⍴⎕
ngn
3

Ruby , 28 byte

->a,b,c{(a-b)*(b-c)*(c-a)/2}

Cobalah online!

Level River St
sumber
1

Ruby , 56 byte

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

Cobalah online!

Setelah kami mengesampingkan kasus di mana nilai triplet tidak unik, t.sortsetara dengan (dan lebih pendek dari) [1,2,3]atau[*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
}
benj2240
sumber
1

Sekam , 7 byte

ṁ±Ẋ-S:←

Cobalah online!

Penjelasan

Port langsung dari jawaban Dennis's Jelly . S:←menyalin kepala daftar sampai akhir, Ẋ-mengambil perbedaan yang berdekatan, dan ṁ±mengambil tanda dari setiap elemen dan menjumlahkan hasilnya.

Sophia Lechner
sumber
0

Jelly , 8 byte

⁼QȧIḂÐfḢ

Cobalah online!

Tampaknya terlalu ungolfed. :(

Erik the Outgolfer
sumber
0

SHELL , 44 Bytes

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

tes:

 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

Penjelasan:

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

SM , 42 Bytes

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

tes:

 f(3,2,1)
 -1
 f(1,2,3)
 1
 f(1,2,1)
 0
Ali ISSA
sumber
1
Apakah mungkin hanya untuk mengklaim bahasa bcuntuk menghindari deklarasi panggilan / fungsi asing?
caird coinheringaahing
1
Di shell mana ini bekerja?
Dennis
0

J , 12 byte

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

Cobalah online!

Terjemahan langsung dari solusi APL Uriel ke J.

Penjelasan:

4$] Perpanjang daftar dengan item pertama

2 /\ lakukan hal berikut untuk semua pasangan yang tumpang tindih dalam daftar:

*@- temukan tanda perbedaan mereka

1#. menjumlahkan

Galen Ivanov
sumber
1
Saya akan meninggalkan solusi berbasis determinan Vandermonde ini di sini sebagai komentar untuk berjaga-jaga jika ada yang tahu bagaimana cara melakukannya:(-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller
0

Japt , 7 byte

änUÌ xg

Cobalah


Penjelasan

            :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

Mengambil input sebagai bilangan bulat individual.

NänW ×z

Cobalah

Shaggy
sumber