Фон
Соотношение перестановок , как определено в Википедии , выглядит следующим образом:
Знак или сигнатура перестановки σ обозначается как 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
(три транспонирования)Ответы:
Желе,
1312 байтПопробуйте онлайн!
Как это устроено
источник
MATL ,
1716 байт1 байт удален благодаря предложению Денниса
Это работает в текущей версии (15.0.0) языка.
Попробуйте онлайн !
объяснение
Здесь используется определение паритета в терминах инверсий. Инверсия - это пара элементов во втором массиве, которые расположены в «неправильном» порядке по сравнению с первым массивом. Поскольку первый массив не нужно сортировать, мы сначала сортируем его, и та же самая перестановка, необходимая для этой сортировки, применяется ко второму массиву. Тогда инверсия соответствует паре элементов, которая не увеличивается во втором массиве.
Также обратите внимание, что два входных массива можно поменять местами, и результат будет одинаковым. Поэтому не важно, какой массив считается «оригинальным», а какой «переставленным».
источник
x(1:end-2)
т. Д. Без явного указания размераx
. Не уверен, что это был хороший выбор, но я думаю, что уже слишком поздно, чтобы измениться :-) Возможно, я найду совместимый способ добавить модульную индексацию0
имеет значение «последняя запись», поэтому я могу сохранить байт (удалить приращение). Спасибо за идею!Октава,
5652 байтаКажется, что пока никто не использует этот подход: в основном я просто использую определители соответствующих матриц перестановок. Выражение
det(eye(nnz(a))(a,:))
возвращает определитель матрицы перестановок, определенной векторомa
. Тогда это просто вопрос извлечения правильного символа из строки, в зависимости от результата.источник
Haskell, 58 байт
Использование:
Тот же метод, что и мой ответ на Python . гордый haskeller сохранил байт с
cycle
.источник
cycle"eo"!!...
вместо"eo"!!mod(...)2
сохранения одного байта.Python 2, 68 байт
Использование:
Подсчитывает количество пар инверсии двух сжатых списков, т.е. значения
(a,A)
и(b,B)
из каждого списка в том же индексе сa<b
иA>B
. Эти сравнения объединяютсяa<b<M>A>B
, используя свойство того, что списокM
больше любого числа. Затем сумма берется по модулю 2 и превращается вe
илиo
.источник
JavaScript (ES6), 73 байта
Поскольку нас интересует только паритет, любые повторяющиеся транспозиции просто отменяются. Удобно, чтобы индексы массивов JavaScript не были многомерными.
источник
Mathematica, 77 байтов
Я согласен!
источник
Cycles
. Это увеличивает размерPermutationCycles
имени и дажеPermutationCycles
глупо, возвращаяCycles
объект! `Mathematica, 31 байт
Мы можем переупорядочить один список в другой, сначала переупорядочив один список в любой порядок (в данном случае канонический порядок) и переупорядочив этот список в окончательный список. Знак общей перестановки является четным, если знаки двух подстановок равны.
источник