"Схема рими" - це рядок літер 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
), за умови, що це не виявиться досить тривіальним, і я був занадто дурним, щоб його знайти.