Levi-Civita符号


29

三维Levi-Civita符号是一个函数f,该函数采用,至中的(i,j,k)每个数字的三进制,定义为:{1,2,3}{-1,0,1}

  • f(i,j,k) = 0i,j,k不显着,即,i=jj=kk=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)行列式的列3x3矩阵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

Answers:


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)(或旋转),其中ij可以相等,则差异为(0,ji,ij)jiij的符号相反,因此符号的总和为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)(或旋转),其中ij可能相等,则差为(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))

行列式公式的直接实现。对单位矩阵的列进行置换,然后采用行列式。




4

JavaScript(ES6),38个字节

过于复杂但有趣:

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

在线尝试!


JavaScript(ES6),28个字节

使用标准公式:

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

在线尝试!






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

外壳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

BC42个字节

 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以避免不必要的调用/函数声明?
caird coinheringaahing

1
哪个外壳中工作?
丹尼斯


0

J,12个字节

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

在线尝试!

将Uriel的APL解决方案直接翻译成J。

说明:

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

试试吧



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.