Фон
Парність перестановки , як визначено вікіпедії , виглядає наступним чином :
Знак або підпис перестановки σ позначається sgn (σ) і визначається як +1, якщо σ парне і −1, якщо σ непарне.
Знак перестановки можна явно виразити як
sgn (σ) = (−1) ^ N (σ)
де N (σ) - кількість інверсій у σ.
Альтернативно, знак перестановки σ можна визначити з її розкладання на продукт транспозицій як
sgn (σ) = (−1) ^ m
де m - кількість транспозицій при розкладанні.
Для тих із вас, хто не любить грецький алфавітний суп у своїй математиці, я спробую трохи спростити визначення на прикладі (також вкрадене з wikipedia).
Приклад
Розглянемо вхідний масив {1, 2, 3, 4, 5}
і перестановку його, скажімо, {3, 4, 5, 2, 1}
. Для того щоб дістатись з початкового масиву до його перестановки, ви повинні поміняти індекси 0
та 2
, 1
і 3
, потім 2
і 4
. Хоча це не унікальне рішення, паритет чітко визначений, тому це працює у всіх випадках.
Оскільки для цього потрібні 3 підкачки, ми позначимо цю перестановку odd
парністю. Як ви могли очікувати, перестановка, яка вимагає рівного розміру свопів, має even
паритет.
Виклик
Ваше завдання полягає в тому, щоб написати програму в якомога менше байтах, щоб визначити парність перестановки. Ваша програма чи функція повинні:
- Прийняти як аргументи два вхідні масиви (або рядки), що представляють набір до перестановки та після неї.
- Поверніть або роздрукуйте символ
e
для парного абоo
непарного, враховуючи перестановку. - Слід припустити, що всі індекси в масивах або рядках мають унікальні значення.
Випробування
Якщо припустити, що ви оголосили функцію з назвою f
:
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
Це код-гольф , найкоротша програма в байтах виграє!
[10], [10] -> e
(нульові переміщення). [10 30 20], [30 20 10] -> e
(два транспозиції). [10 30 20 40], [30 20 40 10] -> o
(три транспозиції)