Liên hợp hoán vị


17

Một hoán vị của kích thước n là sự sắp xếp lại của n số nguyên dương đầu tiên . (có nghĩa là mỗi số nguyên xuất hiện một lần và chính xác một lần). Hoán vị có thể được coi như các hàm thay đổi thứ tự của một danh sách các mục có kích thước n . Ví dụ

(4 1 2 3) ["a", "b", "c", "d"] = ["d", "a", "b", "c"]

Do đó hoán vị có thể được sáng tác như các hàm.

(4 1 2 3)(2 1 3 4) = (4 2 1 3)

Điều này mang lại rất nhiều tính chất thú vị. Hôm nay chúng tôi đang tập trung vào liên hợp . Hoán vị yx (cả hai kích thước n ) là liên hợp iff có hoán vị gg -1 (cũng có kích thước n ) sao cho

x = gyg-1

gg -1 bằng với hoán vị danh tính ( n số đầu tiên theo đúng thứ tự).

Nhiệm vụ của bạn là lấy hai hoán vị có cùng kích thước thông qua các phương thức nhập chuẩn và quyết định xem chúng có phải là liên hợp hay không. Bạn nên xuất một trong hai giá trị nhất quán, một giá trị nếu chúng là liên hợp và giá trị còn lại nếu không.

Đây là vì vậy câu trả lời sẽ được tính bằng byte với ít byte hơn.

Có rất nhiều định lý về hoán vị liên hợp theo ý của bạn, vì vậy chúc may mắn và chơi golf vui vẻ.

Bạn có thể lấy đầu vào là một thùng chứa các giá trị theo thứ tự (1-n hoặc 0-n) đại diện cho hoán vị như trên hoặc là một hàm lấy một thùng chứa có thứ tự và thực hiện hoán vị. Nếu bạn chọn thực hiện chức năng, bạn nên lấy nó làm đối số thay vì đặt nó ở tên được xác định trước.

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

(1) (1) -> True
(1 2) (2 1) -> False
(2 1) (2 1) -> True
(4 1 3 2) (4 2 1 3) -> True
(3 2 1 4) (4 3 2 1) -> False 
(2 1 3 4 5 7 6) (1 3 2 5 4 6 7) -> True

Chúng ta có thể lấy đầu vào là một chức năng? Chúng ta cũng có thể lấy kích thước n?
xnor

@xnor Chắc chắn về cả hai tính. Tôi không chắc chắn làm thế nào đầu tiên sẽ giúp bạn mặc dù.
Thuật sĩ lúa mì

Các quy tắc nhập hàm mặc định cho phép hàm được giả định là được xác định trước, giúp tiết kiệm byte khi viết nó dưới dạng đối số, nếu bạn cho phép.
xnor

@xnor Có phải chúng ta đang nói về quy tắc này? Đó là cho các chức năng hộp đen mà hoán vị không. Điều này có ý nghĩa bởi vì sự đồng thuận đó được thiết kế để cho phép các ngôn ngữ không có con trỏ / đối tượng chức năng cạnh tranh trong khi ở đây chúng có thể vì hoán vị có thể được biểu diễn theo cách khác.
Thuật sĩ lúa mì

Tôi đã không nghĩ đến sự khác biệt của chúng là hộp đen. Vì vậy, ở đây, đầu vào có thể là một chức năng, nhưng chỉ là một đối số rõ ràng?
xnor

Câu trả lời:


6

Python 2 , 87 byte

f=lambda P,k:k<1or len({sum([x==eval('L['*k+'x'+']'*k)for x in L])for L in P})&f(P,k-1)

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

Đưa đầu vào với Pmột cặp cả hai hoán vị và kđộ dài của chúng. Đầu ra 1cho liên hợp và 0không.

Điều này sử dụng kết quả:

Hai hoán vị xy được liên hợp chính xác nếu lũy thừa k - x của chúng x ky k có số điểm cố định bằng nhau cho mọi k từ 0 đến n .

Hai hoán vị liên hợp thỏa mãn điều này bởi vì các lũy thừa thứ k của chúng cũng là liên hợp và liên hợp giữ nguyên số điểm cố định.

Rõ ràng là bất kỳ hai hoán vị không liên hợp luôn khác nhau. Cụ thể, tính liên hợp được xác định bởi danh sách các độ dài chu kỳ được sắp xếp và chúng có thể được phục hồi từ số lượng điểm cố định. Một cách để thể hiện điều này là với đại số tuyến tính, mặc dù nó có thể là quá mức cần thiết.

Gọi X là ma trận hoán vị cho x . Khi đó, số điểm cố định của x kTr (X k ) . Các dấu vết này là các đa thức đối xứng tổng công suất của các giá trị riêng của X k với bội số. Các đa thức cho k từ 0 đến n cho phép chúng ta phục hồi các đa thức đối xứng cơ bản tương ứng của các giá trị riêng này, và do đó đa thức đặc trưng và do đó chính các giá trị riêng.

Vì các giá trị riêng này là gốc của sự thống nhất tương ứng với các chu kỳ của x , từ đó chúng ta có thể phục hồi các kích thước chu kỳ và bội số của chúng. Vì vậy, "chữ ký" của chúng tôi xác định hoán vị cho đến chia động từ.


6

J , 25 byte 23 byte 16 byte

dặm giải pháp ngầm:

-:&([:/:~#&>)&C.

Giải pháp rõ ràng của OP:

c=:4 :'-://:~"1#&>C.&>x;y'   

Điều này kiểm tra xem các hoán vị x và y có cùng loại chu kỳ hay không, sử dụng hàm dựng sẵn C.để tạo các biểu diễn chu trình.

   4 1 3 2   c   4 2 1 3
1
   3 2 1 4   c   4 3 2 1
0
   2 1 3 4 5 7 6   c   1 3 2 5 4 6 7
1

1
Chào mừng bạn đến với PPCG và bài đăng đầu tiên tốt đẹp. Tôi rút ngắn phương thức của bạn xuống 16 byte -:&([:/:~#&>)&C.bằng cách sử dụng một hình thức ngầm. Đây là một liên kết TIO để dùng thử.
dặm

Cảm ơn bạn. :) Tôi vẫn còn khá mới bắt đầu J, và mặc dù tôi có thể dễ dàng sử dụng nó với các hình thức rõ ràng, việc soạn thảo các hình thức ngầm hiệu quả vẫn đòi hỏi tôi rất nhiều suy nghĩ. Tôi sẽ thêm giải pháp của bạn.
Mathias Dolidon

Tái bút: chúng ta cũng không đếm các ký tự chức năng của bài tập sao? c=:
Mathias Dolidon

1
@MathiasDolidon Không, theo mặc định, chúng tôi không tính các ký tự cần thiết để gán, vì hàm này có thể được sử dụng nguyên trạng (với dấu ngoặc đơn, nhưng chúng tôi không đếm chúng).
Erik the Outgolfer 16/2/18

1
ĐỒNG Ý ! Tôi đã cập nhật hồi tố cho các giải pháp rõ ràng trong tiêu đề để tính đến điều này.
Mathias Dolidon

4

MATL , 20 19 17 16 byte

xY@!"&G@)@b)X=va

Đầu vào: hai vectơ cột (sử dụng ;như dấu phân cách). Đầu ra: 1nếu liên hợp, 0nếu không.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Không có định lý về hoán vị được sử dụng (từ sự thiếu hiểu biết tuyệt đối); chỉ cần vũ phu và hai sự thật này:

  • Đối với hai hoán vị pq , thành phần pq tương đương với việc sử dụng p để lập chỉ mục các phần tử của q .

  • Điều kiện x = gyg 1 tương đương với xg = gy .

Mã nhận xét:

x      % Implicitly input first permutation, x. Delete it. Gets copied into clipboard G
Y@     % Implicitly input second permutation, y. Push a matrix with all permutations
       % of its elements, each permutation on a different row. So each matrix row is
       % a permutation of [1 2 ...n], where n is the size of y
!      % Transpose. Now each permutation is a column
"      % For each column
  &G   %   Push x, then y
  @    %   Push current column. This is a candidate g permutation
  )    %   Reference indexing. This gives g composed with y
  @    %   Push current column again
  b    %   Bubble up. Moves x to the top of the stack
  )    %   Reference indexing. This gives x composed with g
  X=   %   Are they equal as vectors? Gives true or false
  v    %   Concatenate stack so far. The stack contains the latest true/false result
       %   and possibly the accumulated result from previous iterations
  a    %   Any: gives true if any element is true. This is the "accumulating" function
       % Implicit end. Implicit display


2

Thạch , 11 byte

Œ!©Ụ€ịị"®⁸e

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

Làm thế nào nó hoạt động

Œ!©Ụ€ịị"®⁸e  Main link. Left argument: x. Right argument: y

Œ!©          Take all permutations g of x. Copy the result to the register.
   Ụ€        Grade up each; sort the indices of each permutation g by their
             corresponding values. For permutations of [1, ..., n], grading up
             essentially computes the inverse, g⁻¹.
     ị       Let each g⁻¹ index into y, computing g⁻¹y.
      ị"®    Let the results index into the corresponding g, computing g⁻¹yg.
         ⁸e  Test if x occurs in the result.

Theo như tôi hiểu, thực ra yđó là chỉ mục cho nhau g⁻¹chứ không phải theo cách khác. Xem ví dụ , (4 1 2 3)(2 1 3 4) = (4 2 1 3). Với cách tiếp cận của bạn, nó sẽ dẫn đến (1 4 2 3)thay vào đó, vì các chỉ mục thứ hai thành thứ nhất. Nếu tính đến điều đó, tôi có một giải pháp 12 byte mà tôi chưa làm hỏng. :-)
Erik the Outgolfer 16/2/18

@EriktheOutgolfer Đã sửa.
Dennis

@Dennis Nhưng tôi đã không đi đến kết luận đó dựa trên lời giải thích, tôi đã đi đến cùng một cách tiếp cận, ngoại trừ việc tôi có một cái gì đó giống như Œ!©Ụ€⁹ịЀ®ị"⁸e(về cơ bản tất cả lập chỉ mục với các đối số đảo ngược), ngoại trừ ngắn hơn sau khi tôi thực hiện các sửa đổi lớn. Tôi không nghĩ g⁻¹yglà giống như gyg⁻¹. Ngoài ra, tôi nghĩ rằng câu trả lời của bạn cũng có thể được hưởng lợi từ những sửa đổi đó, nhưng, như tôi đã nói trước đây, tôi chưa muốn phá hỏng cuộc vui.
Erik the Outgolfer 16/2/18

Vâng, nó giống hệt nhau. Nếu x = g⁻¹yg, sau đó gxg⁻¹ = y, như vậy xylà liên hợp.
Dennis

Hừm, tôi cảm thấy mình nên tiết lộ giải pháp 12 byte của mình sau đó:eŒ!ị"Ụị@¥€¥¥
Erik the Outgolfer 16/2/18

1

Husk , 9 byte

¤¦ṠmöLU¡!

Trả về 1cho liên hợp và 0không liên hợp. Hãy thử trực tuyến!

Giải trình

Các lớp liên hợp của một hoán vị P của L = [1,2, .., n] được xác định bởi MultiSet chứa giai đoạn tối thiểu của mỗi số trong L dưới P . Khi P được lấy ở định dạng danh sách, tôi có thể thay thế L bằng P và nhận cùng một multiset. Chương trình tính toán multiset tương ứng cho mỗi đầu vào và kiểm tra xem một cái có phải là một multiset của cái kia không. Vì chúng có cùng số lượng phần tử, điều này tương đương với cùng một multiset.

¤¦ṠmöLU¡!  Implicit inputs: two lists of integers.
¤          Apply one function to both and combine with another function.
  ṠmöLU¡!  First function. Argument: a list P.
  Ṡm       Map this function over P:
       ¡!  iterate indexing into P,
      U    take longest prefix with unique elements,
    öL     take its length.
 ¦         Combining function: is the first list a subset of the other, counting multiplicities?

1

Perl, 61 58 57 byte

Bao gồm +2choap

Cho phép hoán vị dựa trên 0 là 2 dòng trên STDIN

perl -ap '$_=[@1]~~[@1=map{-grep$_-$G[$i++%@G],@F=@G[@F]}@G=@F,0]'
3 0 2 1
3 1 0 2
^D

Thuật toán là một biến thể nhỏ trên một trong giải pháp của xnor

Phiên bản cũ hơn của mã này gặp lỗi perl và bỏ lõi cho một số đầu vào trên perl mới nhất của tôi 5.26.1, nhưng nó hoạt động trên một perl cũ hơn 5.16.3.

@{$.}=map{-grep$_==$F[$i++%@F],@G=@F[@G]}@G=@F,0}{$_=@1~~@2

Nó có thể là một ví dụ khác về kẻ thù perlgolf cũ của tôi, thực tế là perl không hoàn thành đúng cách ngăn xếp của nó.


1

JavaScript (ES6), 66 64 byte

(a,b,g=a=>b+a.map(h=(e,i)=>e-i&&1+h(a[e],i)).sort())=>g(a)==g(b)

Nếu tôi đã đọc các câu trả lời khác một cách chính xác, vấn đề tương đương với việc đếm các khoảng thời gian của tất cả các yếu tố và kiểm tra xem hai danh sách có cùng số của từng thời kỳ hay không. Chỉnh sửa: Đã lưu 1 byte nhờ @Arnauld bằng cách tính ít hơn một byte so với khoảng thời gian. Đã lưu một byte khác nhờ @Arnauld bằng cách lạm dụng các quy tắc cưỡng chế kỳ lạ của JavaScript để so sánh các mảng. Một byte khác có thể được lưu bằng cách nấu cà ri nhưng tôi không thích cà ri trừ khi đó là gà tikka masala.

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.