А «рифма схема» представляет собой последовательность букв a
в z
, таким образом, что первые вхождения символов в порядке возрастания (без пробелов), начиная с a
. Например (отмечены первые вхождения):
abccdbebdcfa
^^^ ^ ^ ^
Количество рифмовых схем длины N
определяется числами Белла B(N)
. ( OEIS A000110 )
Соревнование
Ваша задача - реализовать перечисление этих схем рифм, т.е. биективное отображение из целых в рифманные схемы. Вам дано положительное целое число N <= 26
, а также неотрицательное целое число 0 <= i < B(N)
. Кроме того, вы можете использовать диапазон 1 <= i <= B(N)
. Вы должны вывести рифмованную схему длины N
, такую, чтобы каждый i
получал свою строку.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Вы можете использовать строчные или прописные буквы (последовательно).
Ваш код должен быть в состоянии справиться с любым действительным вкладом в разумном количестве времени (например , не более чем на несколько часов для N = 26
, худшего случая i
). Это должно позволить решениям, которые масштабируются экспоненциально с N
(для небольших баз), даже на медленных языках, но запрещать решения, которые линейно масштабируются с i
(то есть B(N)
). В частности, это означает, что вы не можете просто перебрать все действительные схемы длины рифмы, N
пока не откажетесь от i
схем.
Применяются стандартные правила игры в гольф .
Примеры
Точное назначение i
схем (т. Е. Порядок схем для данного N
) зависит от вас. Но, скажем, вы выбрали лексикографический порядок, ваше решение должно соответствовать следующей таблице (с -
указанием неверного ввода):
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
Вот короткий скрипт CJam, который генерирует все действительные схемы рифмы для любой заданной длины (но не пытайтесь больше 10, или вы будете ждать некоторое время).
N
), при условии, что оно не окажется достаточно тривиальным, и я был просто слишком глуп, чтобы найти его.