Фон
Соотношение перестановок , как определено в Википедии , выглядит следующим образом:
Знак или сигнатура перестановки σ обозначается как sgn (σ) и определяется как +1, если σ четное, и -1, если σ нечетное.
Знак перестановки может быть явно выражен как
sgn (σ) = (−1) ^ N (σ)
где N (σ) - число инверсий в σ.
Альтернативно, знак перестановки σ может быть определен из ее разложения в произведение транспозиций как
sgn (σ) = (−1) ^ m
где m - количество транспозиций в разложении.
Для тех из вас, кто не любит греческий алфавит в своей математике, я постараюсь немного упростить определение на примере (также украденном из википедии).
пример
Рассмотрим входной массив {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
(три транспонирования)