Un "schéma de rimes" est une chaîne de lettres a
à z
, de sorte que les premières occurrences des caractères soient dans l'ordre croissant (sans espaces), à partir de a
. Par exemple (avec les premières occurrences marquées):
abccdbebdcfa
^^^ ^ ^ ^
Le nombre de schémas de rimes de longueur N
est donné par les nombres de Bell B(N)
. ( OEIS A000110 )
Le défi
Votre tâche consiste à implémenter une énumération de ces schémas de rimes, c'est-à-dire un mappage bijectif d'entiers aux schémas de rimes. On vous donne un entier positif N <= 26
, ainsi qu'un entier non négatif 0 <= i < B(N)
. Vous pouvez également utiliser la plage 1 <= i <= B(N)
. Vous devez sortir un schéma de rimes de longueur N
, de sorte que chaque i
donne une chaîne différente.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
Vous pouvez utiliser des minuscules ou des majuscules (systématiquement).
Votre code doit être capable de gérer toute entrée valide dans un délai raisonnable (par exemple pas plus de quelques heures pour N = 26
, le pire des cas i
). Cela devrait permettre des solutions qui évoluent de façon exponentielle avec N
(pour les petites bases), même dans des langages lents, mais interdire les solutions qui évoluent de façon linéaire avec i
(c'est-à-dire B(N)
). En particulier, cela signifie que vous ne pouvez pas simplement parcourir tous les schémas de rimes valides N
jusqu'à ce que vous ayez supprimé les i
schémas.
Les règles de code-golf standard s'appliquent.
Exemples
L'affectation exacte des i
schémas à (c'est-à-dire l'ordre des schémas pour une donnée N
) dépend de vous. Mais supposons que vous ayez choisi l'ordre lexicographique, votre solution devrait correspondre au tableau suivant (avec -
une entrée non valide):
N\i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 a - - - - - - - - - - - - - -
2 aa ab - - - - - - - - - - - - -
3 aaa aab aba abb abc - - - - - - - - - -
4 aaaa aaab aaba aabb aabc abaa abab abac abba abbb abbc abca abcb abcc abcd
Voici un court script CJam qui génère tous les schémas de rimes valides pour une longueur donnée (mais n'essayez pas plus de 10 ou vous attendrez un peu).
N
), à condition que cela ne se révèle pas assez trivial et que j'étais tout simplement trop stupide pour la trouver.