如何优雅的生成“指定长度”的“指定字符集”的所有字符串?

2016-01-18 23:18:21 +08:00
 abelyao

可能问题有点绕,题目不描述,举个例子:

如果指定长度为 3 而字符集为 abc,那就生成 aaa, aab, aac, aba ... ccc
如果指定长度为 4 而字符集为 abcdefg,那就按顺序生成 aaaa ... gggg

显然套 for 循环的话就没办法动态长度了,那么还有啥优雅的方法来实现吗?递归?
脑海中有那个大概思路,但写出来结果都不对…
干脆就不要脸一点… 能不能直接来段代码…

4204 次点击
所在节点    问与答
30 条回复
Arthur2e5
2016-01-19 12:25:43 +08:00
@windfarer 快用 python with braces (逃

然后日常 bash 实现:
https://gist.github.com/Arthur2e5/4c3950c8f012d1d4ae62#file-foo-bash
Arthur2e5
2016-01-19 12:39:54 +08:00
@Arthur2e5 另外里面我的确是用了 for ……所以动态长度那个是瞎讲吧?
abelyao
2016-01-19 14:56:56 +08:00
@lxy42
@imgalaxy
@just1
@msg7086
@virusdefender
@windfarer
@Arthur2e5

谢谢大家的例子,怪我一开始没说什么语言,目前我的技能树也就点亮到能看懂 C# / PHP / JS 这几个… 真的让我长见识,尤其是 ruby 那个也太狠了… 一行就搞定… 看来可以扩展一下技能树了…

@Bryan0Z 原先也想过用 26 进制来实现,然后直接从起始值 for 循环到结束值,不过貌似 26 进制也是用递归来实现的,有点多余计算了…
Bryan0Z
2016-01-19 17:09:03 +08:00
@abelyao 26 进制为什么要递归, while 不就好了
abelyao
2016-01-19 17:41:47 +08:00
@Bryan0Z 也对…
lululau
2016-01-19 17:47:04 +08:00
perl -le 'print for "aaa".."zzz"'
lululau
2016-01-19 17:47:41 +08:00
ruby -e '("aaa".."zzz").each { |x| puts x}'
lululau
2016-01-19 17:49:25 +08:00
ruby -e 'puts [*"aaa".."zzz"]'
windfarer
2016-01-19 21:50:45 +08:00
@lululau 逆天了
msg7086
2016-01-19 22:57:08 +08:00
@lululau 人家要求限定字符集的,用 range 做不了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/251705

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX