Étant donné deux permutations sous forme de cycle disjoint, sortez leur produit / composition sous forme de cycle disjoint.
Pour trouver la composition, convertissez les cycles disjoints en permutations en notation à deux lignes. Chaque numéro d'une partie disjointe d'un cycle est mappé sur le numéro qui le suit dans la même partie. Il s'enroule. Alors 1 -> 5
, 5 -> 1
, 2 -> 4
, 4 -> 2
. Si un nombre n'est pas trouvé 3 -> 3
, il est mappé sur lui-même. Le premier cycle disjoint pourrait également être écrit (1 5)(2 4)(3)
. Ces mappages sont convertis en deux lignes, comme ceci (notez que l'ordre de P et Q sont inversés):
[Le] produit de deux permutations est obtenu en réorganisant les colonnes de la deuxième permutation (la plus à gauche) de sorte que sa première ligne soit identique à la deuxième ligne de la première permutation (la plus à droite). Le produit peut alors être écrit comme la première ligne de la première permutation sur la deuxième ligne de la deuxième permutation modifiée.
Règles:
- L'entrée sera donnée sous la forme d'une liste de listes ou d'un format similaire
- Vous ne pouvez pas prendre quelque chose comme
(1 5)(2 4)
as[5, 4, 3, 2, 1]
, déjà sous forme de deux lignes (mappage de l'index à la valeur) - Tous les nombres ne doivent pas nécessairement se produire dans chaque groupe, vous pourriez donc avoir
(1 5)·(1 2)
, ce qui entraînerait(2 5 1)
. - Votre sortie doit pouvoir être utilisée comme entrée.
- Vous n'avez pas besoin de prendre en charge la saisie avec un cycle vide
(1 5)·()
. Ce serait plutôt donné comme(1 5)·(1)
ou quelque chose d'équivalent. - Étant donné que les cycles se déroulent, l'ordre n'a pas d'importance tant que le résultat est correct.
- Vous pouvez commencer à zéro ou à un. Ce n'est pas grave, car les résultats sont les mêmes.
- Les nombres peuvent être supérieurs à
9
. - Vous ne pouvez pas inclure le même nombre plus d'une fois dans la sortie. Ce
[[1],[1]]
n'est donc pas permis. - Notez que cette opération n'est pas commutative ! J'ai mis Q avant P, parce que c'est ce que Wikipedia a fait. Vous pouvez choisir n'importe quelle commande, mais spécifiez laquelle si elle est différente.
- Victoires de code les plus courtes
- Les fonctions intégrées sont autorisées, mais si vous en utilisez une, montrez une solution sans l'utiliser également.
Exemples:
Toutes les possibilités de sortie équivalentes ne sont pas affichées
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]]
la source
Réponses:
J , 7 octets
Essayez-le en ligne!
la source
Mathematica, 15 octets
Oui Virginie, il y a une fonction intégrée .... Mathematica prend en charge un type de données de permutation déjà en notation de cycle disjoint: cette fonction pure prend en entrée n'importe quel nombre d'arguments dans le formulaire
Cycles[{{1, 5}, {2, 4}}]
et sort la permutation du produit, toujours sousCycles[]
forme. Il utilise la convention de commande opposée à l'OP, donc par exemple,retourne
Cycles[{{1, 4, 3, 5}}]
. Le⊙
symbole que j'ai utilisé ci-dessus devrait vraiment être le symbole Unicode à usage privé U + F3DE de 3 octets pour fonctionner dans Mathematica. Notez que Mathematica a une fonction intégrée nommée pour cette opérationPermutationProduct
, mais c'est trois octets de plus.la source
Haskell ,
157148 octetsÉDITER:
p++q
. Ordre des arguments échangés deg
. Débarrasséd
en commençantiterate
parp x
, après quoi iltakeWhile
n'est plus à égalité avecfst
+span
. Madeiterate
infix.Faire cela pendant que je suis en retard ... peut probablement jouer au golf encore plus.
C'était plus simple et semblait être autorisé, donc la sortie comprend des cycles à élément unique.
Essayez-le en ligne!
Comment ça fonctionne:
#
est la fonction principale.q#p
prend deux listes de listes de nombres et renvoie une liste similaire. Les tests semblent avoir Q avant P donc j'ai utilisé le même ordre.f p
convertit la permutationp
de la forme du cycle disjoint en une fonction, après quoif q
ellef p
peut être composée avec l'opérateur de composition habituel.
.c
, recherchanta
et trouvant son successeur. Si la compréhension ne trouve rien, ellea
est juste retournée.zip(0:c)(c++c)
est une liste de paires d'élémentsc
et de leurs successeurs. Puisque la question nous permet de «commencer à un», nous pouvons utiliser0
comme valeur fictive; il est moins coûteux d'ajouter cezip
premier argument au premier argument que de l'utilisertail
sur le second.g l p
prend une listel
d'éléments, et une fonction de permutationp
, et retourne la liste des cycles touchant les éléments.c
le cycle contenant le premier élémentx
de la liste, les autres éléments dec
sont trouvés en itérant dep x
jusqu'à ce quex
soit retrouvé. Lors de la récurrence pour trouver les cycles restants, tous les éléments dec
sont d'abord supprimés avec une liste de compréhension.la source
Python, 220 octets
la source
Python 3.8 , 187 octets
Essayez-le en ligne! ou Vérifiez tous les cas de test!
Entrée :
q
etp
dans cet ordre, chacun est un ensemble de tuples, deSTDIN
.Sortie : permutation du produit
Q·P
sous la forme d'un ensemble de tuples, versSTDERR
.Explication
La fonction
g
trouve quel nombre correspond au nombrei
dans la permutationp
(akag
est la permutation inverse dep
).La fonction
h
prend un nombre et renvoie le cycleQ·P
qui contient ce nombre. Le cycle renvoyé sera un tuple, formaté de manière à ce que le plus petit élément soit à l'index 0.En appliquant
h
à tous les numéros, nous pouvons obtenir tous les cyclesQ·P
. Pour éviter les cycles en double dans notre résultat, nous plaçons simplement tous les cycles dans un ensemble. Cela fonctionne car des cycles similaires retournés parh
seront formatés sur le même tuple (avec le plus petit élément à l'index 0).Nous avons seulement besoin de considérer les nombres apparaissant dans
P
ouQ
, car tous les autres nombres se mapperont à eux-mêmes.la source