Um "esquema de rima" é uma sequência de letras a
para z
, de modo que as primeiras ocorrências dos caracteres estejam em ordem crescente (sem lacunas), a partir de a
. Por exemplo (com as primeiras ocorrências marcadas):
abccdbebdcfa
^^^ ^ ^ ^
O número de esquemas de rima de comprimento N
é dado pelos números de Bell B(N)
. ( OEIS A000110 )
O desafio
Sua tarefa é implementar uma enumeração desses esquemas de rima, ou seja, um mapeamento bijetivo de números inteiros para esquemas de rima. Você recebe um número inteiro positivo e um número inteiro N <= 26
não negativo 0 <= i < B(N)
. Como alternativa, você pode usar o intervalo 1 <= i <= B(N)
. Você deve produzir um esquema de rima de comprimento N
, de modo que cada i
um produza uma sequência diferente.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Você pode usar letras maiúsculas ou minúsculas (de forma consistente).
Seu código deve ser capaz de lidar com qualquer entrada válida em quantidade razoável de tempo (por exemplo, não mais do que algumas horas para N = 26
, pior caso i
). Isso deve permitir soluções que escalam exponencialmente com N
(para pequenas bases), mesmo em linguagens lentas, mas proíbem soluções que escalam linearmente com i
(ie B(N)
). Em particular, isso significa que você não pode simplesmente repetir todos os esquemas de rima válidos N
até ter descartado os i
esquemas.
Aplicam-se as regras de código-golfe padrão .
Exemplos
A atribuição exata dos i
esquemas a (isto é, a ordem dos esquemas para um determinado N
) depende de você. Mas digamos que você escolheu a ordem lexicográfica, sua solução deve corresponder à seguinte tabela (com a -
indicação de entrada invá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
Aqui está um pequeno script CJam que gera todos os esquemas de rima válidos para um determinado comprimento (mas não tente mais de 10 ou você esperará um pouco).
N
), desde que isso não seja razoavelmente trivial e eu seja estúpido demais para encontrá-la.