Biểu tượng Levi-Civita


29

Biểu tượng Levi-Civita ba chiều là một hàm flấy ba số của (i,j,k)mỗi số {1,2,3}, đến {-1,0,1}, được định nghĩa là:

  • f(i,j,k) = 0khi i,j,kkhông rõ rệt, tức là i=jhay j=khayk=i
  • f(i,j,k) = 1khi (i,j,k)là một sự thay đổi theo chu kỳ của (1,2,3), đó là một trong những (1,2,3), (2,3,1), (3,1,2).
  • f(i,j,k) = -1khi (i,j,k)là một sự thay đổi theo chu kỳ của (3,2,1), đó là một trong những (3,2,1), (2,1,3), (1,3,2).

Kết quả là dấu hiệu của một hoán vị của (1,2,3), với các phép không hoán vị cho 0. Ngoài ra, nếu chúng ta liên kết các giá trị 1,2,3với các vectơ cơ sở đơn vị trực giao e_1, e_2, e_3, thì đó f(i,j,k)định thức của ma trận 3x3 với các cột e_i, e_j, e_k.

Đầu vào

Ba số mỗi từ {1,2,3}theo thứ tự. Hoặc, bạn có thể chọn sử dụng chỉ mục không {0,1,2}.

Đầu ra

Giá trị hàm Levi-Civita của họ từ {-1,0,1}. Đây là mã golf.

Các trường hợp thử nghiệm

Có 27 đầu vào có thể.

(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

Câu trả lời:


20

Thạch , 5 byte

ṁ4IṠS

Hãy thử trực tuyến!

Thuật toán

Hãy xem xét sự khác biệt ji, kj, ik .

  • Nếu (i, j, k) là một phép quay của (1, 2, 3) , thì sự khác biệt là một phép quay của (1, 1, -2) . Lấy tổng của các dấu hiệu, ta được 1 + 1 + (-1) = 1 .

  • Nếu (i, j, k) là một phép quay của (3, 2, 1) , thì sự khác biệt là một phép quay của (-1, -1, 2) . Lấy tổng của các dấu, ta được (-1) + (-1) + 1 = -1 .

  • Với (i, i, j) (hoặc một phép quay), trong đó ij có thể bằng nhau, sự khác biệt là (0, ji, ij) . Dấu hiệu của jiij trái ngược nhau, do đó tổng các dấu hiệu là 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.

Đẹp - chắc chắn đây là thuật toán dự định của xnor.
Sản phẩm ETH

8

Python 2 , 32 byte

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

Hãy thử trực tuyến!

Thuật toán

Hãy xem xét sự khác biệt ij, jk, ki .

  • Nếu (i, j, k) là một phép quay của (1, 2, 3) , thì sự khác biệt là một phép quay của (-1, -1, 2) . Lấy sản phẩm, ta được (-1) × (-1) × 2 = 2 .

  • Nếu (i, j, k) là một phép quay của (3, 2, 1) , thì sự khác biệt là một phép quay của (1, 1, -2) . Lấy sản phẩm, ta được 1 × 1 × (-2) = -2 .

  • Với (i, i, j) (hoặc một phép quay), trong đó ij có thể bằng nhau, sự khác biệt là (0, ij, ji) . Lấy sản phẩm, ta được 0 × (ij) × (ji) = 0 .

Do đó, chia sản phẩm của sự khác biệt cho 2 mang lại kết quả mong muốn.


7

x86, 15 byte

Lấy đối số trong %al, %dl, %bl, lợi nhuận trong %al. Thực hiện đơn giản bằng cách sử dụng công thức của 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 

Ngoài ra: Tôi nghĩ rằng tôi hiểu tại sao %eaxbây giờ là "người tích lũy" ...


Tôi nghĩ bạn có nghĩa là sarkhông shr.
Jester

@Jester bắt tốt. đã sửa
qwr 28/03/18

6

Octave, 20 byte

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

Khá trực tiếp thực hiện các công thức xác định. Cho phép các cột của ma trận danh tính sau đó lấy định thức.









1

Ruby , 56 byte

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

Hãy thử trực tuyến!

Khi chúng tôi loại trừ các trường hợp trong đó các giá trị của bộ ba không phải là duy nhất, t.sorttương đương với (và ngắn hơn) [1,2,3]hoặc[*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

CHIA SẺ , 44 byte

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

kiểm tra:

 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

Giải trình :

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

BC , 42 byte

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

kiểm tra:

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

1
Có thể chỉ yêu cầu ngôn ngữ là bcđể tránh khai báo cuộc gọi / chức năng không liên quan?
caird coinheringaahing

1
Trong đó vỏ làm công việc này?
Dennis


0

J , 12 byte

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

Hãy thử trực tuyến!

Dịch trực tiếp giải pháp APL của Uriel sang J.

Giải trình:

4$] Mở rộng danh sách với mục đầu tiên

2 /\ làm như sau cho tất cả các cặp chồng chéo trong danh sách:

*@- tìm dấu hiệu của sự khác biệt của họ

1#. thêm lên


1
Tôi sẽ để lại giải pháp dựa trên yếu tố quyết định Vandermonde này ở đây như một nhận xét trong trường hợp bất kỳ ai cũng có thể tìm ra cách đánh golf nó:(-/ .*)@:(^&(i.3)"0)%2:
Kyle Miller

0

Japt , 7 byte

änUÌ xg

Thử nó


Giải trình

            :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

Thay thế

Lấy đầu vào là số nguyên riêng lẻ.

NänW ×z

Thử nó



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.