Uno "schema di rime" è una stringa di lettere a
in modo z
tale che le prime occorrenze dei personaggi sono in ordine crescente (senza spazi vuoti), a partire da a
. Ad esempio (con le prime occorrenze contrassegnate):
abccdbebdcfa
^^^ ^ ^ ^
Il numero di schemi di rima di lunghezza N
è dato dai numeri di Bell B(N)
. ( OEIS A000110 )
La sfida
Il tuo compito è implementare un elenco di questi schemi di rima, ovvero una mappatura biiettiva da numeri interi a schemi di rima. Ti viene dato un numero intero positivo N <= 26
, nonché un numero intero non negativo 0 <= i < B(N)
. In alternativa, è possibile utilizzare l'intervallo 1 <= i <= B(N)
. Dovresti produrre uno schema di rima di lunghezza N
, in modo tale che ognuno i
produca una stringa diversa.
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).
Puoi usare lettere maiuscole o minuscole (in modo coerente).
Il codice deve essere in grado di gestire qualsiasi input valido ragionevole lasso di tempo (ad esempio , non più di un paio d'ore per N = 26
, caso peggiore i
). Ciò dovrebbe consentire soluzioni che si adattano in modo esponenziale con N
(per basi di piccole dimensioni), anche in linguaggi lenti ma che vietano soluzioni che si adattano in modo lineare con i
(ovvero B(N)
). In particolare, ciò significa che non puoi semplicemente scorrere tutti gli schemi di rima validi N
fino a quando non hai scartato gli i
schemi.
Si applicano le regole standard del code-golf .
Esempi
L'esatta assegnazione degli i
schemi a (cioè l'ordine degli schemi per un dato N
) dipende da te. Ma supponiamo che tu abbia scelto l'ordinamento lessicografico, la tua soluzione dovrebbe corrispondere alla seguente tabella (con -
input non valido):
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
Ecco uno script CJam breve che genera tutti gli schemi di rima validi per una data lunghezza (ma non provare più di 10 o aspetteresti un po ').
N
), a condizione che non si riveli abbastanza banale ed ero troppo stupido per trovarla.