Учитывая две перестановки в форме непересекающегося цикла, выведите их произведение / композицию в форме непересекающегося цикла.
Чтобы найти композицию, преобразуйте непересекающиеся циклы в перестановки в двухстрочной записи. Каждое число в непересекающейся части цикла отображается на число, следующее за ним в той же части. Это оборачивается. Так 1 -> 5
, 5 -> 1
, 2 -> 4
, 4 -> 2
. Если число не найдено 3 -> 3
, оно отображается на себя. Первый непересекающийся цикл также может быть записан (1 5)(2 4)(3)
. Эти отображения преобразуются в две строки, например, так (обратите внимание, что порядок P и Q поменялся местами):
[T] произведение двух перестановок получается путем перестановки столбцов второй (самой левой) перестановки так, чтобы ее первая строка совпадала со второй строкой первой (самой правой) перестановки. Затем произведение может быть записано как первая строка первой перестановки над второй строкой модифицированной второй перестановки.
Правила:
- Ввод будет предоставлен в виде списка списков или аналогичного формата
- Вы не можете принимать что-то вроде
(1 5)(2 4)
as[5, 4, 3, 2, 1]
, уже в двухстрочной форме (отображение индекса на значение) - Не все числа должны встречаться в каждой группе, так что вы могли бы иметь
(1 5)·(1 2)
, в результате(2 5 1)
. - Ваш вывод должен быть в качестве вашего ввода.
- Вам не нужно поддерживать ввод с пустым циклом
(1 5)·()
. Это вместо этого будет дано(1 5)·(1)
или как что-то эквивалентное. - Поскольку циклы повторяются, порядок не имеет значения, пока результат правильный.
- Вы можете начать с нуля или единицы. Это не имеет значения, потому что результаты одинаковы.
- Числа могут быть больше, чем
9
. - Вы не можете включать один и тот же номер более одного раза в вывод. Так
[[1],[1]]
что не допускается. - Обратите внимание, что эта операция не является коммутативной ! Я поставил Q перед P, потому что это то, что сделал Википедия. Вы можете выбрать любой заказ, но указать, какой, если он отличается.
- Самый короткий код выигрывает
- Встроенные модули разрешены, но если вы их используете, покажите решение, не используя его.
Примеры:
Не все эквивалентные возможности вывода показаны
Input
Output
[[1, 5], [2, 4]], [[1, 2, 4, 3]]
[[1, 4, 3, 5]] (or [[4, 3, 5, 1]] or ...)
[[1, 5]], [[1, 2]]
[[2, 5, 1]]
[[10, 2, 3]], [[2]]
[[3, 10, 2]]
[[1]], [[3]]
[[]] (or [[1]] or something equivalent)
[[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]], [[5,6,7,9,14],[2,8,3,10],[1,11]]
[[12, 14, 6, 1], [8, 15, 10, 3, 2], [13, 11, 7, 9, 4]]
(arguments in reverse order from above gives a different answer)
[[5,6,7,9,14],[2,8,3,10],[1,11]], [[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]]
[[9, 14, 4, 13, 1], [10, 8, 3, 15, 2], [7, 11, 12, 5]]
источник
Ответы:
J 7 байт
Попробуйте онлайн!
источник
Mathematica, 15 байт
Да, Вирджиния, есть встроенная функция .... Mathematica поддерживает тип данных перестановки, который уже находится в записи непересекающегося цикла: эта чистая функция принимает в качестве входных данных любое количество аргументов в форме
Cycles[{{1, 5}, {2, 4}}]
и выводит перестановку продуктов, снова вCycles[]
форме. Он использует соглашение об обратном порядке в качестве OP, например,возвращается
Cycles[{{1, 4, 3, 5}}]
.⊙
Символ я выше должен действительно быть 3-байтовый частного использования Unicode символ U + F3DE для работы в Mathematica. Обратите внимание, что Mathematica имеет именованную встроенную функцию для этой операцииPermutationProduct
, но это на три байта длиннее.источник
Хаскелл ,
157148 байтРЕДАКТИРОВАТЬ:
p++q
. Поменялся местами порядок аргументовg
. Избавилсяd
, начавiterate
с тогоp x
, после чегоtakeWhile
перестал связыватьfst
+span
. Сделалiterate
инфикс.Занимаясь этим, пока я опаздываю ... возможно, могу еще поиграть в гольф.
Это было проще и казалось разрешенным, поэтому выходные данные включают одноэлементные циклы.
Попробуйте онлайн!
Как это работает:
#
это основная функция.q#p
берет два списка списков чисел и возвращает аналогичный список. Тесты, кажется, имеют Q до P, поэтому я использовал тот же порядок.f p
преобразует перестановкуp
из непересекающейся формы цикла в функцию, после чегоf q
иf p
может быть составлена с помощью обычного оператора композиции.
.c
, ищаa
и находя его преемника. Если понимание ничего не находит,a
просто возвращается.zip(0:c)(c++c)
список пар элементовc
и их наследников Поскольку вопрос позволяет нам «начинать с одного», мы можем использовать0
в качестве фиктивного значения; дешевле добавить это кzip
первому аргументу, чем использоватьtail
ко второму.g l p
принимает списокl
элементов и функцию перестановкиp
и возвращает список циклов, касающихся элементов.c
цикл, содержащий первый элементx
списка, другие элементы которогоc
находятся путем итерации,p x
пока неx
будет найден снова. При повторном поиске оставшихся циклов все элементыc
сначала удаляются с пониманием списка.источник
Python, 220 байт
источник
Python 3,8 , 187 байт
Попробуйте онлайн! или проверьте все тестовые случаи!
Входные данные :
q
иp
в этом порядке, каждый представляет собой набор кортежей, изSTDIN
.Вывод : перестановка произведений
Q·P
в виде набора кортежей, доSTDERR
.объяснение
Функция
g
находит, какое число отображается на числоi
в перестановкеp
(akag
- обратная перестановкаp
).Функция
h
принимает число и возвращает цикл, вQ·P
котором содержится это число. Возвращенный цикл будет кортежем, отформатированным таким образом, чтобы наименьший элемент имел индекс 0.Применяя
h
ко всем числам, мы можем получить все циклыQ·P
. Чтобы избежать дублирования циклов в нашем результате, мы просто помещаем все циклы в набор. Это работает, поскольку похожие циклы, возвращаемые функцией,h
будут отформатированы в один и тот же кортеж (с наименьшим элементом с индексом 0).Нам нужно только рассмотреть числа, появляющиеся в
P
илиQ
, так как все остальные числа будут отображаться на себя.источник