Кон'югат перестановок


17

Перестановка розміру n - це переупорядкування перших n натуральних чисел. (тобто кожне ціле число з’являється один раз і точно один раз). Перестановки можна трактувати як функції, що змінюють порядок списку елементів розміром n . Наприклад

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

Таким чином, перестановки можуть бути складені як функції.

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

Це спричиняє масу цікавих властивостей. Сьогодні ми зосереджуємось на поєднанні . Перестановки y і x (обидва розміру n ) є кон'югатами, якщо є перестановки g і g -1 (також розміру n ) такі, що

x = gyg-1

і gg -1 дорівнює перестановці тотожності (перші n чисел у належному порядку).

Ваше завдання - взяти дві перестановки однакового розміру за допомогою стандартних методів введення та вирішити, чи є вони кон'югатами. Вам слід вивести одне з двох послідовних значень, одне, якщо вони є сполучниками, а друге, якщо їх немає.

Це тому відповіді будуть набрані в байтах, а менша кількість байтів буде кращою.

Існує безліч теорем про суміжні перестановки, які є у вашому розпорядженні, тому удачі та щасливого гольфу.

Ви можете приймати введення як упорядкований контейнер значень (або 1-n або 0-n), що представляє перестановку, як вище, або як функція, яка приймає впорядкований контейнер і виконує перестановку. Якщо ви вирішили взяти функцію, слід сприймати її як аргумент, а не мати її заздалегідь визначеним іменем.

Випробування

(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

Чи можемо ми взяти введення як функцію? Чи можемо ми також взяти розмір n?
xnor

@xnor Безумовно, в обох випадках. Я не впевнений, як перший допоможе вам.
Опублікувати Rock Garf Hunter

Правила введення функції за замовчуванням дозволяють вважати функцію заздалегідь визначеною, що дозволяє економити байти при написанні її як аргументу, якщо ви це дозволите.
xnor

@xnor Ми говоримо про це правило? Це стосується функцій чорного поля, перестановок яких немає. Це має сенс, оскільки цей консенсус створений для того, щоб дозволити конкурувати мови без покажчиків / об'єктів функцій, тоді як тут вони можуть, оскільки перестановки можуть бути представлені інакше.
Опублікувати Rock Garf Hunter

Я був, я не думав, що відмінність їх буде чорною скринькою. Отже, тут вхід може бути функцією, але лише як явний аргумент?
xnor

Відповіді:


6

Python 2 , 87 байт

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)

Спробуйте в Інтернеті!

Приймає введення з Pпарами як перестановок, так і kїх довжини. Виходи 1для кон'югатів, а 0не.

Для цього використовується результат:

Дві перестановки x і y поєднуються точно, якщо їх k -й сили x k і y k мають рівну кількість фіксованих точок для кожного k від 0 до n .

Дві кон'югатні перестановки задовольняють це тому, що їх k -й сили також є сполученими, а кон'югація зберігає кількість фіксованих точок.

Менш очевидно, що будь-які дві несполучені перестановки завжди відрізняються. Зокрема, кон'югація визначається відсортованим переліком довжин циклу, і їх можна відновити за кількістю фіксованих точок. Один із способів показати це за допомогою лінійної алгебри, хоча це може бути непосильним.

Нехай X - матриця перестановки для x . Тоді число нерухомих точок x k дорівнює Tr (X k ) . Ці сліди є силовими сумою симетричних многочленів власних значень X k з кратністю. Ці многочлени для k від 0 до n дозволяють відновити відповідні елементарні симетричні многочлени цих власних значень, а отже, і характерні многочлени, і так самі власні значення.

Оскільки ці власні значення є коренями єдності, що відповідають циклам x , з них ми можемо відновити розміри циклу та їх кратність. Отже, наш "підпис" ототожнює перестановку аж до кон'югації.


6

J , 25 байт 23 байт 16 байт

милі " мовчазне рішення":

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

Явне рішення ОП:

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

Це перевіряє, чи перестановки x і y мають один і той же тип циклу, використовуючи вбудовану C.функцію для створення уявлень циклу.

   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
Ласкаво просимо до PPCG та приємного першого повідомлення. Я скоротив ваш метод до 16 байт -:&([:/:~#&>)&C., використовуючи негласну форму. Ось посилання TIO, щоб випробувати його.
миль

Дякую. :) Я все ще досить початківець J, і хоча мені здається, що я легко використовую це з явними формами, для складання ефективних мовчазних форм все ще потрібна надмірна думка для мене. Я додам ваше рішення.
Матіас Долідон

PS: Чи не вважаємо ми також функції функціональних призначень? c=:
Матіас Долідон

1
@MathiasDolidon Ні, за консенсусом за замовчуванням ми не рахуємо символів, необхідних для призначення, оскільки функція може використовуватися як є (з дужками, але ми їх не рахуємо).
Ерік Аутгольфер

1
ДОБРЕ ! Я заднім числом оновив підрахунки для явного рішення в заголовку, щоб врахувати це.
Матіас Долідон

4

MATL , 20 19 17 16 байт

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

Вхід: два векторів стовпців (використовуючи ;як роздільник). Вихід: 1якщо кон'югат, 0якщо ні.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Немає теорем про перестановки, що використовуються (із-за цілковитого незнання); просто груба сила і ці два факти:

  • Для двох перестановок p і q композиція pq еквівалентна використанню p для індексації елементів q .

  • Умова x = gyg −1 еквівалентно xg = gy .

Коментований код:

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

Желе , 11 байт

Œ!©Ụ€ịị"®⁸e

Спробуйте в Інтернеті!

Як це працює

Œ!©Ụ€ịị"®⁸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.

Наскільки я розумію, це саме те, yщо індексується у кожного g⁻¹, а не навпаки. Дивіться приклад, (4 1 2 3)(2 1 3 4) = (4 2 1 3). При вашому підході це призведе до (1 4 2 3)того, що другий індексує перший. Враховуючи це, у мене є 12-байтне рішення, яке поки не зіпсую. :-)
Ерік Аутгольфер

Виправлено @EriktheOutgolfer.
Денніс

@Dennis Але я не прийшов до цього висновку на підставі пояснення, я прийшов до точно такого ж підходу, за винятком того, що у мене було щось на кшталт Œ!©Ụ€⁹ịЀ®ị"⁸e(в основному все індексація із зворотними аргументами), за винятком більш коротких після того, як я вніс основні зміни. Я не думаю, що g⁻¹ygце те саме, що gyg⁻¹. Крім того, я думаю, що ваша відповідь може отримати користь і від цих модифікацій, але, як я вже говорив раніше, я не хочу ще зруйнувати забаву.
Ерік Аутгольфер

Так, саме так. Якщо x = g⁻¹yg, значить gxg⁻¹ = y, так xі yє сполучниками.
Денніс

Гм, я відчуваю, що я повинен розкрити своє 12- eŒ!ị"Ụị@¥€¥¥
байтне

1

Лушпиння , 9 байт

¤¦ṠmöLU¡!

Повертається як 1для кон'югату, так і 0для неконьюгата. Спробуйте в Інтернеті!

Пояснення

Клас пов'язаності перестановок P з L = [1,2, .., п] визначається мультімножество , що містить найменший період кожного числа в L під P . Коли P взято у форматі списку, я можу замінити L на P і отримати той самий мультисет. Програма обчислює відповідні мультисети для кожного введення і перевіряє, чи є один підмножиною іншого. Оскільки вони мають однакову кількість елементів, це еквівалентно тому ж мультисету.

¤¦Ṡ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 байт

Включає +2 дляap

Дайте перестановки на основі 0, як 2 рядки на 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

Алгоритм є незначною варіацією щодо в xnor

Ця старша версія коду потрапляє на помилку Perl і скидає ядро ​​для декількох входів на моєму останньому perl 5.26.1, але він працює на більш старій програмі 5.16.3.

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

Можливо, це ще один екземпляр мого старого ворога perlgolf, той факт, що perl не відмовляється належним чином своїм стеком.


1

JavaScript (ES6), 66 64 байт

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

Якщо я правильно прочитав інші відповіді, проблема еквівалентна підрахунку періодів усіх елементів та перевірки наявності двох списків однакової кількості кожного періоду. Редагувати: Збережено 1 байт завдяки @Arnauld шляхом обчислення на один менше, ніж за період. Збережено ще один байт завдяки @Arnauld, використовуючи дивні правила примусу JavaScript для порівняння масивів. Ще один байт можна врятувати за допомогою каррі, але мені не подобається каррі, якщо це не куряча тика масала.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.