“押韵方案”是a
to 的字母字符串,以z
使字符的首次出现按从()开始的升序排列(无间隔)a
。例如(标记为首次出现):
abccdbebdcfa
^^^ ^ ^ ^
长度的押韵方案的数目N
由贝尔数 给出B(N)
。(OEIS A000110)
挑战
您的任务是实现这些押韵方案的枚举,即从整数到押韵方案的双射映射。您会得到一个正整数N <= 26
,以及一个非负整数0 <= i < B(N)
。或者,您可以使用range 1 <= i <= B(N)
。您应该输出一个length的押韵方案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
),条件是事实证明这并不是一件很琐碎的事,而我却太愚蠢而找不到它。