Dadas dos permutaciones en forma de ciclo disjunto, envíe su producto / composición en forma de ciclo disjunto.
Para encontrar la composición, convierta los ciclos disjuntos en permutaciones en notación de dos líneas. Cada número en una parte disjunta de un ciclo se asigna al número que le sigue en la misma parte. Se envuelve. Así 1 -> 5
, 5 -> 1
, 2 -> 4
, 4 -> 2
. Si no se encuentra un número 3 -> 3
, se asigna a sí mismo. El primer ciclo disjunto también podría escribirse (1 5)(2 4)(3)
. Estas asignaciones se convierten en dos líneas, así (tenga en cuenta que el orden de P y Q se invierte):
[E] l producto de dos permutaciones se obtiene reorganizando las columnas de la segunda permutación (más a la izquierda) de modo que su primera fila sea idéntica a la segunda fila de la primera permutación (más a la derecha). El producto puede entonces escribirse como la primera fila de la primera permutación sobre la segunda fila de la segunda permutación modificada.
Reglas:
- La entrada se dará como una lista de listas o formato similar
- Es posible que no tome algo así
(1 5)(2 4)
como[5, 4, 3, 2, 1]
, ya en forma de dos líneas (asignación de índice a valor) - No todos los números tienen que aparecer en cada grupo, por lo que podría haber
(1 5)·(1 2)
resultado(2 5 1)
. - Su salida debe poder usarse como su entrada.
- No necesita admitir entradas con un ciclo vacío
(1 5)·()
. Eso se daría como(1 5)·(1)
algo equivalente. - Dado que los ciclos se ajustan, el orden no importa siempre que el resultado sea correcto.
- Puede comenzar en cero o uno. No importa, porque los resultados son los mismos.
- Los números pueden ser mayores que
9
. - No puede incluir el mismo número más de una vez en la salida. Entonces
[[1],[1]]
no está permitido. - ¡Tenga en cuenta que esta operación no es conmutativa ! Puse Q antes que P, porque eso es lo que hizo Wikipedia. Puede elegir cualquier orden, pero especifique cuál es diferente.
- El código más corto gana
- Los elementos integrados están permitidos, pero si usa uno, muestre una solución sin usarlo también.
Ejemplos:
No se muestran todas las posibilidades de salida equivalentes
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]]
fuente
Respuestas:
J , 7 bytes
Pruébalo en línea!
fuente
Mathematica, 15 bytes
Sí, Virginia, hay una función incorporada ... Mathematica admite un tipo de datos de permutación que ya está en notación de ciclo disjunto: esta función pura toma como entrada cualquier número de argumentos en el formulario
Cycles[{{1, 5}, {2, 4}}]
y genera la permutación del producto, nuevamente enCycles[]
forma. Utiliza la convención de orden opuesta como OP, por ejemplo,vuelve
Cycles[{{1, 4, 3, 5}}]
. El⊙
símbolo que utilicé anteriormente realmente debería ser el símbolo Unicode de uso privado de 3 bytes U + F3DE para trabajar en Mathematica. Tenga en cuenta que Mathematica tiene un nombre incorporado para esta operaciónPermutationProduct
, pero eso es tres bytes más.fuente
Haskell ,
157148bytesEDITAR:
p++q
. Orden de argumento intercambiado deg
. Se deshizod
comenzandoiterate
conp x
, después de lo cualtakeWhile
ya no está empatado confst
+span
. Hechoiterate
infijo.Hacer esto mientras llego tarde ... probablemente pueda jugar al golf un poco más.
Era más simple y parecía estar permitido, por lo que la salida incluye ciclos de un solo elemento.
Pruébalo en línea!
Cómo funciona:
#
Es la función principal.q#p
toma dos listas de listas de números y devuelve una lista similar. Las pruebas parecen tener Q antes de P, así que usé el mismo orden.f p
convierte la permutaciónp
de forma ciclo disjuntos a una función, después de lo cualf q
yf p
puede estar compuesto con el operador de composición usual.
.c
, buscandoa
y encontrando a su sucesor. Si la comprensión no encuentra nada,a
solo se devuelve.zip(0:c)(c++c)
es una lista de pares de elementosc
y sus sucesores. Como la pregunta nos permite "comenzar en uno", podemos usarlo0
como un valor ficticio; es más barato anteponer eso alzip
primer argumento que usarlotail
en el segundo.g l p
toma una listal
de elementos y una función de permutaciónp
, y devuelve la lista de ciclos que tocan los elementos.c
está el ciclo que contiene el primer elementox
de la lista, los otros elementosc
se encuentran iterando desdep x
hasta quex
se encuentre nuevamente. Al recurrir para encontrar los ciclos restantes, todos los elementos dec
se eliminan primero con una lista de comprensión.fuente
Python, 220 bytes
fuente
Python 3.8 , 187 bytes
Pruébalo en línea! o ¡ Verifique todos los casos de prueba!
Entrada :
q
yp
en ese orden, cada uno es un conjunto de tuplas, desdeSTDIN
.Salida : La permutación del producto
Q·P
como un conjunto de tuplas, aSTDERR
.Explicación
La función
g
encuentra qué número se asigna al númeroi
en la permutaciónp
(también conocido comog
la permutación inversa dep
).La función
h
toma un número y devuelve el cicloQ·P
que contiene ese número. El ciclo devuelto será una tupla, formateada de tal manera que el elemento más pequeño esté en el índice 0.Al aplicar
h
a todos los números, podemos obtener todos los ciclosQ·P
. Para evitar ciclos duplicados en nuestro resultado, simplemente colocamos todos los ciclos en un conjunto. Esto funciona ya que los ciclos similares devueltos porh
serán formateados a la misma tupla (con el elemento más pequeño en el índice 0).Solo necesitamos considerar los números que aparecen en
P
oQ
, ya que todos los demás números se asignarán a sí mismos.fuente