Un "esquema de rima" es una cadena de letras a
para z
, de modo que las primeras apariciones de los caracteres están en orden ascendente (sin espacios), comenzando desde a
. Por ejemplo (con las primeras ocurrencias marcadas):
abccdbebdcfa
^^^ ^ ^ ^
La cantidad de esquemas de rima de longitud N
viene dada por los números de Bell B(N)
. ( OEIS A000110 )
El reto
Su tarea es implementar una enumeración de estos esquemas de rima, es decir, un mapeo biyectivo de enteros a esquemas de rima. Te dan un número entero positivo N <= 26
, así como un número entero no negativo 0 <= i < B(N)
. Alternativamente, puede usar el rango 1 <= i <= B(N)
. Debe generar un esquema de rima de longitud N
, de modo que cada uno i
produzca una cadena diferente.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
Puede usar letras minúsculas o mayúsculas (consistentemente).
Su código debe ser capaz de manejar cualquier entrada válida en un tiempo razonable (por ejemplo, no más de unas pocas horas para el N = 26
peor de los casos i
). Esto debería permitir soluciones que se escalen exponencialmente con N
(para bases pequeñas), incluso en lenguajes lentos pero que prohíban soluciones que se escalen linealmente con i
(es decir B(N)
). En particular, eso significa que no puede simplemente iterar a través de todos los esquemas de longitud de rima válidos N
hasta que haya descartado los i
esquemas.
Se aplican reglas estándar de código de golf .
Ejemplos
La asignación exacta de los i
esquemas to (es decir, el orden de los esquemas para un determinado N
) depende de usted. Pero supongamos que eligió el orden lexicográfico, su solución debe corresponder a la siguiente tabla (con una -
entrada no válida):
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
Aquí hay un breve script de CJam que genera todos los esquemas de rima válidos para cualquier longitud dada (pero no intentes más de 10 o esperarás un tiempo).
N
), siempre que no resulte ser bastante trivial y fui demasiado estúpido para encontrarla.