Символ Леві-Цівіта


29

Тривимірний символ Levi-Civita - це функція, що fприймає потрійних чисел, (i,j,k)кожне в {1,2,3}, до {-1,0,1}, визначене як:

  • f(i,j,k) = 0коли i,j,kне відрізняються, тобто i=jабо j=kабоk=i
  • f(i,j,k) = 1коли (i,j,k)циклічний зсув (1,2,3), це один з (1,2,3), (2,3,1), (3,1,2).
  • f(i,j,k) = -1коли (i,j,k)циклічний зсув (3,2,1), це один з (3,2,1), (2,1,3), (1,3,2).

Результат є знаком перестановки в (1,2,3), з не-перестановки дають 0. З іншого боку , якщо зіставити значення 1,2,3з ортогональним блоком базисних векторами e_1, e_2, e_3, то f(i,j,k)є визначник матриці 3х3 з колонами e_i, e_j, e_k.

Вхідні дані

По три номери кожен з {1,2,3}порядку. Або ви можете скористатися нульовим індексом {0,1,2}.

Вихід

Значення їх функції Levi-Civita від {-1,0,1}. Це код гольфу.

Тестові справи

Є 27 можливих входів.

(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

Відповіді:


20

Желе , 5 байт

ṁ4IṠS

Спробуйте в Інтернеті!

Алгоритм

Розглянемо відмінності ji, kj, ik .

  • Якщо (i, j, k) - це обертання (1, 2, 3) , різниці - це обертання (1, 1, -2) . Беручи суму знаків, отримуємо 1 + 1 + (-1) = 1 .

  • Якщо (i, j, k) - це обертання (3, 2, 1) , різниці - це обертання (-1, -1, 2) . Беручи суму знаків, отримуємо (-1) + (-1) + 1 = -1 .

  • Для (i, i, j) (або обертання), де i і j можуть бути рівними, різниці (0, ji, ij) . Ознаки ji і ij протилежні, тому сума знаків 0 + 0 = 0 .

Код

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

Красиво - безумовно, це був призначений алгоритм xnor.
ETHproductions

8

Python 2 , 32 байти

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

Спробуйте в Інтернеті!

Алгоритм

Розглянемо відмінності ij, jk, ki .

  • Якщо (i, j, k) - це обертання (1, 2, 3) , різниці - це обертання (-1, -1, 2) . Беручи добуток, отримуємо (-1) × (-1) × 2 = 2 .

  • Якщо (i, j, k) - це обертання (3, 2, 1) , різниці - це обертання (1, 1, -2) . Беручи добуток, отримуємо 1 × 1 × (-2) = -2 .

  • Для (i, i, j) (або обертання), де i і j можуть бути рівними, різниці (0, ij, ji) . Беручи добуток, отримуємо 0 × (ij) × (ji) = 0 .

Таким чином, ділення добутку різниць на 2 дає бажаний результат.


7

x86, 15 байт

Приймає аргументи %al, %dl, %bl, повертається в %al. Безпосередня реалізація за допомогою формули Денніса.

 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 

Убік: Я думаю, я розумію, чому %eaxзараз "акумулятор" ...


Я думаю, ти це sarне мав на увазі shr.
Джестер

@Jester хороший улов. виправлено
qwr

6

Октава, 20 байт

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

Досить пряма реалізація детермінантної формули. Перестановки стовпців матриці ідентичності приймає детермінант.


5

Мова Вольфрама (Mathematica) , 9 байт

Signature

Спробуйте в Інтернеті!


Мова Вольфрама (Mathematica) , 18 байт

Збережено 2 байти завдяки Мартіну Ендеру.

Det@{#^0,#,#^2}/2&

Спробуйте в Інтернеті!


вбудовані - не весело
qwr

2
Детермінант Вандермонде приємний. Також є Det@IdentityMatrix[3][[#]]&(довше, але менше жетонів).
Кайл Міллер

1
#^1просто #;)
Мартін Ендер







1

Рубін , 56 байт

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

Спробуйте в Інтернеті!

Як тільки ми виключаємо випадки, коли значення триплета не є унікальними, t.sortеквівалентні (і коротші, ніж) [1,2,3]або[*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 байт

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

тести:

 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

Пояснення:

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

До н.е. , 42 байт

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

тести:

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

1
Чи можна просто вимагати мову, bcщоб уникнути стороннього оголошення / виклику?
кард-коінхергінг

1
У якій оболонці це працює?
Денніс


0

J , 12 байт

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

Спробуйте в Інтернеті!

Прямий переклад рішення APL Уріеля на Дж.

Пояснення:

4$] Розширює список своїм першим пунктом

2 /\ виконайте наступне для всіх пар, що перекриваються у списку:

*@- знайти ознаку їх різниці

1#. складати


1
Я залишу це рішення, засноване на Вандермонде, тут як коментар, якщо хтось зможе зрозуміти, як його пограти:(-/ .*)@:(^&(i.3)"0)%2:
Кайл Міллер

0

Japt , 7 байт

änUÌ xg

Спробуй це


Пояснення

            :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

Альтернатива

Вводиться як окремі цілі числа.

NänW ×z

Спробуй це



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.