Si vous avez déjà été exposé à la culture japonaise ou asiatique, vous aurez sûrement rencontré le jeu Amidakuji:
Comme l'explique Wikipedia , il s'agit d'un type de loterie dessiné sur papier et utilisé pour sélectionner aléatoirement une permutation de N éléments.
Par exemple, il peut être utilisé pour attribuer au hasard une séquence de départ à N personnes, ou N prix à N personnes, et ainsi de suite.
L'astuce pour comprendre pourquoi le jeu représente une permutation est de réaliser que chaque coup horizontal (appelé "jambe") échange ses deux éléments en place.
La même page Wikipédia explique également que chaque permutation P de N éléments correspond à un nombre infini de diagrammes d'Amidakuji. Celui (s) avec le moins de coups horizontaux (jambes) sont appelés les "nombres premiers" de cette permutation particulière P.
Votre tâche consiste à recevoir un diagramme Amidakuji avec 2 lignes verticales ou plus (dans cet exemple, elles sont 6) dans ce format (moins les lettres):
A B C D E F
| | | | | |
|-| |-| |-|
| |-| |-| |
| | | | |-|
| |-| |-| |
| | |-| |-|
| | |-| | |
|-| | |-| |
|-| |-| | |
| |-| | |-|
| | | | | |
B C A D F E
Et produisez l'un de ses nombres premiers (encore une fois, moins les lettres):
A B C D E F
| | | | | |
|-| | | |-|
| |-| | | |
| | | | | |
B C A D F E
Les première et dernière lignes avec les lettres ne font pas partie du format. Je les ai ajoutés ici pour montrer la permutation. Il n'est pas non plus nécessaire que la première ou la dernière ligne ne contienne pas de segments |-|
, ni que la sortie soit aussi compacte que possible.
Cet exemple d'entrée particulier est l'une des représentations ASCII (infinies) du diagramme d'Amidakuji en haut de la page Wikipedia.
Il existe une règle non évidente concernant ces diagrammes ASCII: les tronçons adjacents sont interdits.
|-|-| <- NO, this does not represent a single swap!
Wikipedia explique une procédure standard pour obtenir un nombre premier à partir d'un diagramme, appelé "bubblisation", qui consiste à appliquer les simplifications suivantes encore et encore:
1) Fourche droite à fourche gauche:
| |-| |-| |
|-| | -> | |-|
| |-| |-| |
2) Élimination des doubles:
|-| | |
|-| -> | |
Je ne sais pas si cette explication est sans ambiguïté. Votre code peut utiliser cette technique ou tout autre algorithme qui produit les nombres premiers requis.
Le code le plus court gagne.
Des règles et des allocations standard s'appliquent. (Si l'entrée n'est pas valide, votre programme peut prendre feu. Les formats d'entrée / sortie peuvent être stdin / stdout, argument chaîne, liste de lignes, matrice de caractères, tout ce qui vous convient le mieux, etc.)