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


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.