Levi-Civitaシンボル


29

三次元エディントンのイプシロンは関数であるf数のトリプル取る(i,j,k)の各{1,2,3}にし、{-1,0,1}として定義されます。

  • f(i,j,k) = 0i,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

入力

それぞれから3つの数字 {1,2,3}順に。または、zero-indexedを使用することもできます{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)は(または回転)、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
ジェスター

@ジェスター良いキャッチ。修正
qwr

6

オクターブ、20バイト

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

決定式のかなり直接的な実装。単位行列の列を並べ替えてから、行列式を取ります。


5

Wolfram言語(Mathematica)、9バイト

Signature

オンラインでお試しください!


Wolfram言語(Mathematica)、18バイト

Martin Enderのおかげで2バイト節約されました。

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

オンラインでお試しください!


組み込みは面白くない
-qwr

2
Vandermondeの決定要因は素晴らしいです。また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

SHELL44バイト

 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無関係な呼び出し/関数宣言を避けるために言語を主張することは可能ですか?
コイナーリンガーを育てる

1
これはどのシェルで機能しますか?
デニス


0

J、12バイト

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

オンラインでお試しください!

UrielのAPLソリューションをJに直接翻訳

説明:

4$] リストを最初のアイテムで拡張します

2 /\ リスト内の重複するすべてのペアに対して以下を実行します。

*@- 彼らの違いの兆候を見つける

1#. 合計する


1
:誰がどのようにゴルフにそれを把握することができます場合、私はコメントとして、ここでこのヴァンデルモンド-決定ベースのソリューションを残しておきます(-/ .*)@:(^&(i.3)"0)%2:
カイル・ミラー



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.