„Schemat rymów” to ciąg liter a
do z
, dzięki czemu pierwsze wystąpienia znaków są w porządku rosnącym (bez przerw), zaczynając od a
. Na przykład (z zaznaczonymi pierwszymi wystąpieniami):
abccdbebdcfa
^^^ ^ ^ ^
Liczba schematów rymów długości N
jest podana przez liczby Bell B(N)
. ( OEIS A000110 )
Wyzwanie
Twoim zadaniem jest zaimplementowanie wyliczenia tych schematów rymów, tj. Bijective mapping od liczb całkowitych do schematów rymów. Otrzymujesz dodatnią liczbę całkowitą N <= 26
, a także nieujemną liczbę całkowitą 0 <= i < B(N)
. Alternatywnie możesz użyć zakresu 1 <= i <= B(N)
. Powinieneś wypisać schemat rymów długości N
, tak że każdy i
daje inny ciąg znaków.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Możesz używać zarówno małych jak i wielkich liter (konsekwentnie).
Twój kod musi być w stanie obsłużyć każdy ważny wkład w rozsądnym czasie (np nie więcej niż kilka godzin za N = 26
, najgorszym przypadku i
). Powinno to pozwolić na rozwiązania skalowane wykładniczo za pomocą N
(dla małych zasad), nawet w wolnych językach, ale zabraniać rozwiązań skalowanych liniowo za pomocą i
(tj B(N)
.). W szczególności oznacza to, że nie możesz po prostu powtarzać wszystkich prawidłowych schematów rymów, N
dopóki nie odrzucisz i
schematów.
Obowiązują standardowe zasady gry w golfa .
Przykłady
Dokładne przypisanie i
do schematów (tj. Kolejność schematów dla danego N
) zależy od Ciebie. Ale powiedzmy, że wybrałeś porządek leksykograficzny, twoje rozwiązanie powinno odpowiadać poniższej tabeli (z -
oznaczeniem nieprawidłowych danych wejściowych):
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
Oto krótki skrypt CJam, który generuje wszystkie prawidłowe schematy wierszy dla dowolnej długości (ale nie próbuj więcej niż 10, bo poczekaj chwilę).
N
), pod warunkiem, że nie okaże się to dość trywialne i byłem po prostu zbyt głupi, aby go znaleźć.