สัญลักษณ์ Levi-Civita


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)เป็นปัจจัยของเมทริกซ์ 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

คำตอบ:


20

เยลลี่ 5 ไบต์

ṁ4IṠS

ลองออนไลน์!

ขั้นตอนวิธี

ลองพิจารณาความแตกต่างji, กลิ้งเหรียญ, IK

  • หาก(ฉัน j, k)คือการหมุนของ(1, 2, 3)ความแตกต่างที่มีการหมุนของ(1, 1, -2) การรวมกันของสัญญาณที่เราได้รับ1 + 1 + (-1) = 1

  • หาก(ฉัน j, k)คือการหมุนของ(3, 2, 1)ความแตกต่างที่มีการหมุนของ(-1, -1, 2) การรวมกันของสัญญาณที่เราได้รับ(-1) + (-1) + 1 = -1

  • สำหรับ(i, 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

  • หาก(ฉัน j, k)คือการหมุนของ(1, 2, 3)ความแตกต่างที่มีการหมุนของ(-1, -1, 2) ใช้ผลิตภัณฑ์ที่เราได้รับ(-1) × (-1) × 2 = 2

  • หาก(ฉัน j, k)คือการหมุนของ(3, 2, 1)ความแตกต่างที่มีการหมุนของ(1, 1, -2) ใช้ผลิตภัณฑ์ที่เราได้รับ1 × 1 × (-2) = -2

  • สำหรับ(i, 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
ตลก

@ ตลกจับที่ดี คงที่
qwr

6

อ็อกเทฟ 20 ไบต์

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

การใช้สูตรดีเทอร์มิแนนท์โดยตรง อนุญาตคอลัมน์ของเมทริกซ์เอกลักษณ์จากนั้นรับดีเทอร์มิแนนต์


5

ภาษา Wolfram (Mathematica)ขนาด 9 ไบต์

Signature

ลองออนไลน์!


ภาษา Wolfram (Mathematica)ขนาด 18 ไบต์

บันทึก 2 ไบต์ขอบคุณ Martin Ender

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

ลองออนไลน์!


builtins นั้นไม่สนุก
qwr

2
ตัวกำหนด Vandermonde นั้นดี นอกจากนี้ยังมีDet@IdentityMatrix[3][[#]]&(อีกต่อไป แต่น้อยกว่าโทเค็น)
Kyle Miller

1
#^1เป็นเพียง#;)
Martin Ender







1

Ruby , 56 ไบต์

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

ลองออนไลน์!

เมื่อเราแยกแยะกรณีที่ค่าของ triplet ไม่ซ้ำกัน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
}

1

Husk , 7 ไบต์

ṁ±Ẋ-S:←

ลองออนไลน์!

คำอธิบาย

พอร์ตตรงของเดนนิสคำตอบวุ้น S:←คัดลอกส่วนหัวของรายการไปยังจุดสิ้นสุดẊ-ใช้ความแตกต่างที่อยู่ติดกันและṁ±รับสัญญาณของแต่ละองค์ประกอบและสรุปผล




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

BC , 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เพื่อหลีกเลี่ยงการประกาศการโทร / ฟังก์ชั่นที่ไม่เกี่ยวข้อง?
caird coinheringaahing

1
ในที่เปลือกการทำงานนี้
Dennis


0

J , 12 ไบต์

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

ลองออนไลน์!

การแปลโดยตรงของโซลูชัน APL ของ Uriel เป็น J

คำอธิบาย:

4$] ขยายรายการด้วยรายการแรก

2 /\ ทำต่อไปนี้สำหรับคู่ที่ทับซ้อนกันทั้งหมดในรายการ:

*@- ค้นหาสัญลักษณ์ของความแตกต่าง

1#. เพิ่มขึ้น


1
ฉันจะปล่อยให้แก้ปัญหานี้ Vandermonde-ปัจจัยที่ใช้ที่นี่เป็นความคิดเห็นในกรณีที่ทุกคนสามารถคิดออกว่าจะเล่นกอล์ฟมันลง:(-/ .*)@:(^&(i.3)"0)%2:
ไคล์มิลเลอร์

0

Japtap , 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

ลองมัน



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.