Biorąc pod uwagę dwie permutacje w formie rozłącznego cyklu, wyprowadzaj ich produkt / skład w formie rozłącznego cyklu.
Aby znaleźć kompozycję, zamień cykle rozłączne na permutacje w notacji dwuwierszowej. Każda liczba w rozłącznej części cyklu jest odwzorowywana na liczbę występującą po niej w tej samej części. Owija się wokół. Więc 1 -> 5
, 5 -> 1
, 2 -> 4
, 4 -> 2
. Jeśli liczba nie zostanie znaleziona, 3 -> 3
zostanie zamapowana na siebie. Można również napisać pierwszy cykl rozłączny (1 5)(2 4)(3)
. Te odwzorowania są konwertowane na dwie linie, podobnie jak (zauważ, że kolejność P i Q są odwrócone):
[T] iloczyn dwóch permutacji uzyskuje się przez przestawienie kolumn drugiej permutacji (skrajnie z lewej), tak aby jej pierwszy rząd był identyczny z drugim rzędem pierwszego (skrajnie z prawej) permutacji. Produkt można następnie zapisać jako pierwszy wiersz pierwszej permutacji nad drugim rzędem zmodyfikowanej drugiej permutacji.
Zasady:
- Dane wejściowe zostaną podane jako lista list lub podobny format
- Być może nie ma czegoś takiego
(1 5)(2 4)
jak[5, 4, 3, 2, 1]
, już w postaci dwóch linii (indeks mapowanie wartości) - Nie wszystkie liczby muszą występować w każdej grupie, więc możesz to zrobić
(1 5)·(1 2)
, w wyniku czego(2 5 1)
. - Twoje dane wyjściowe powinny być wykorzystywane jako dane wejściowe.
- Nie trzeba wspierać wprowadzania z pustym cyklem
(1 5)·()
. To byłoby zamiast tego podane jako(1 5)·(1)
lub coś równoważnego. - Ponieważ cykle się zawijają, kolejność nie ma znaczenia, dopóki wynik jest prawidłowy.
- Możesz zacząć od zera lub jednego. To nie ma znaczenia, ponieważ wyniki są takie same.
- Liczby mogą być większe niż
9
. - Nie można podać tej samej liczby więcej niż raz w danych wyjściowych. Więc
[[1],[1]]
nie jest dozwolone. - Pamiętaj, że ta operacja nie jest przemienna ! Stawiam Q przed P., bo tak właśnie zrobiła Wikipedia. Możesz wybrać dowolne zamówienie, ale określ, które z nich jest inne.
- Najkrótszy kod wygrywa
- Wbudowane są dozwolone, ale jeśli go użyjesz, pokaż rozwiązanie bez jego użycia.
Przykłady:
Nie pokazano wszystkich równoważnych możliwości wyjściowych
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]]
źródło
Odpowiedzi:
J , 7 bajtów
Wypróbuj online!
źródło
Mathematica, 15 bajtów
Tak, Virginia, jest wbudowany .... Mathematica obsługuje typ danych permutacji już w notacji rozłącznego cyklu: ta czysta funkcja przyjmuje jako dane wejściowe dowolną liczbę argumentów w formularzu
Cycles[{{1, 5}, {2, 4}}]
i generuje permutację produktu, ponownie wCycles[]
formie. Używa przeciwnej konwencji porządkowania jak OP, więc na przykładzwraca
Cycles[{{1, 4, 3, 5}}]
.⊙
Symbol użyłem powyżej powinny być naprawdę 3-bajtowy prywatne wykorzystanie symbol Unicode U + F3DE do pracy w Mathematica. Zauważ, że Mathematica ma wbudowaną nazwę dla tej operacjiPermutationProduct
, ale to trzy bajty dłużej.źródło
Haskell ,
157148 bajtówEDYTOWAĆ:
p++q
. Zamieniona kolejność argumentówg
. Pozbyłemd
się, zaczynająciterate
odp x
, po czymtakeWhile
już nie związany zfst
+span
. Wykonanoiterate
infix.Robię to, kiedy się spóźniłem ... pewnie jeszcze trochę golfa.
To było prostsze i wydawało się być dozwolone, więc wynik zawiera cykle jednoelementowe.
Wypróbuj online!
Jak to działa:
#
jest główną funkcją.q#p
pobiera dwie listy list liczb i zwraca podobną listę. Testy wydają się mieć Q przed P, więc użyłem tej samej kolejności.f p
przekształca permutacjip
z postaci cyklu rozłączne do funkcji, po czymf q
if p
może składać się ze zwykłymi operatora kompozycji.
.c
, szukająca
i znajdując następcę. Jeśli zrozumienie niczego nie znajdzie,a
jest po prostu zwracane.zip(0:c)(c++c)
to lista par elementówc
i ich następców. Ponieważ pytanie pozwala nam „zacząć od pierwszego”, możemy użyć go0
jako wartości zastępczej; taniej jest wstawić to dozip
pierwszego argumentu, niż użyćtail
drugiego.g l p
pobiera listęl
elementów i funkcję permutacjip
i zwraca listę cykli dotykających elementów.c
cykl zawierający pierwszy elementx
listy, pozostałe elementyc
znajdują się poprzez iterację odp x
do dox
znalezienia ponownie. Podczas rekurencji w celu znalezienia pozostałych cykli wszystkie elementyc
są najpierw usuwane ze zrozumieniem listy.źródło
Python, 220 bajtów
źródło
Python 3.8 , 187 bajtów
Wypróbuj online! lub Sprawdź wszystkie przypadki testowe!
Wejście :
q
ip
w tej kolejności, każdy jest zbiorem krotek, zSTDIN
.Dane wyjściowe : permutacja produktu
Q·P
jako zestaw krotek doSTDERR
.Wyjaśnienie
Funkcja
g
wyszukuje, która liczba odwzorowuje liczbęi
w permutacjip
(akag
to permutacja odwrotnap
).Funkcja
h
przyjmuje liczbę i zwraca cyklQ·P
zawierający tę liczbę. Zwrócony cykl będzie krotką sformatowaną w taki sposób, że najmniejszy element ma indeks 0.Stosując
h
do wszystkich liczb, możemy uzyskać wszystkie cykleQ·P
. Aby zapobiec powtarzaniu się cykli w naszym wyniku, po prostu umieszczamy wszystkie cykle w zestawie. Działa to, ponieważ podobne cykle zwrócone przezh
zostaną sformatowane do tej samej krotki (z najmniejszym elementem o indeksie 0).Musimy tylko wziąć pod uwagę liczby pojawiające się w
P
lubQ
, ponieważ wszystkie inne liczby zostaną zmapowane do siebie.źródło