Une séquence de De Bruijn est intéressante: c'est la séquence cyclique la plus courte qui contient toutes les séquences possibles d'un alphabet donné d'une longueur donnée. Par exemple, si nous considérions l'alphabet A, B, C et une longueur de 3, une sortie possible est:
AAABBBCCCABCACCBBAACBCBABAC
Vous remarquerez que chaque séquence possible de 3 caractères en utilisant les lettres A
, B
et C
sont là.
Votre défi est de générer une séquence De Bruijn en aussi peu de caractères que possible. Votre fonction doit prendre deux paramètres, un entier représentant la longueur des séquences et une liste contenant l'alphabet. Votre sortie doit être la séquence sous forme de liste.
Vous pouvez supposer que chaque élément de l'alphabet est distinct.
Un exemple de générateur peut être trouvé ici
Des échappatoires standard s'appliquent
la source
Réponses:
Pyth, 31 octets
Il s'agit de la conversion directe de l'algorithme utilisé dans ma réponse CJam . Conseils pour le golf, bienvenue!
Ce code définit une fonction
g
qui prend deux arguments, la chaîne de liste de caractères et le nombre.Exemple d'utilisation:
Sortie:
Expansion du code:
Essayez-le ici
la source
CJam,
52 4948 octetsC'est étonnamment long. Cela peut être beaucoup joué, en prenant des conseils de la traduction Pyth.
L'entrée va comme
ie - Chaîne de liste de caractères et la longueur.
et la sortie est la chaîne De Bruijn
Essayez-le en ligne ici
la source
CJam,
5249 octetsVoici une approche différente dans CJam:
Prend une entrée comme ceci:
et produit une œuvre de Lyndon comme
Essayez-le ici.
Cela utilise la relation avec les mots de Lyndon . Il génère tous les mots de Lyndon de longueur n dans l'ordre lexicographique (comme indiqué dans cet article Wikipedia), puis supprime ceux dont la longueur ne divise pas n . Cela donne déjà la séquence De Bruijn, mais comme je génère les mots Lyndon sous forme de chaînes de chiffres, je dois également remplacer ceux-ci par les lettres correspondantes à la fin.
Pour des raisons de golf, je considère que les dernières lettres de l'alphabet ont un ordre lexicographique inférieur.
la source
JavaScript (ES6) 143
En utilisant des mots de Lyndon, comme la question de Martin, juste 3 fois de long ...
Test dans la console FireFox / FireBug
Sortie
la source
Python 2, 114 octets
Je ne sais pas trop comment jouer au golf à cause de mon approche.
Essayez-le en ligne
Non golfé:
Ce code est une modification triviale de ma solution à un défi plus récent.
La seule raison
[:1-n]
est nécessaire parce que la séquence inclut le bouclage.la source
Powershell,
16496 octets-68 octets avec -match à la
O($n*2^n)
place du générateur récursifO(n*log(n))
Script non testé et testé:
Sortie:
Voir aussi: Un anneau pour les gouverner tous. Une chaîne pour les contenir tous
la source