【发布时间】:2016-12-22 00:14:52
【问题描述】:
我正在尝试创建一个脚本,该脚本生成一个数组,该数组列出了用户提供的特定长度的字母和数字(以及最终符号)的每个重复排列。例如:
User input: 4
Output:
a
b
...
zzzy
zzzz
我尝试了多种方法来实现这一点,并通过嵌套的 .each 循环在包含 a-z 和 0-9 的数组上获得了我正在寻找的效果。
alphanum.each do |s|
output << s
alphanum.each do |t|
output << s + t
alphanum.each do |r|
output << s + t + r
alphanum.each do |i|
output << s + t + r + i
end
end
end
end
但是,这不能由输入来确定,而且对我来说似乎不是有效的或 rubyesque 的。我尝试了各种其他循环组合,但似乎都没有。一个例子:
# User input
puts "Max length: "
input = gets.chomp
length = input.to_i
# Iterates over the array
length.times do
modded.each do |s|
alphanum.each do |t|
r = s + t
puts r # To test output
modded << r
end
end
end
这会输出 aaaaaaaaaaaaa1 之类的东西,以及其他长度输入仅为 1 或 2 的废话。我该怎么做?
【问题讨论】:
-
@Rilcon42 我认为这是一个很好的考虑方法,但你也必须考虑到可能有重复的字符,这会让事情变得有点复杂
-
没错,我没有注意到他想要那些。也许生成一个组合然后该组合的所有可能排列?上帝,这将是内存密集型的......
-
@Rilcon42 不必如此,除非您打算将数组存储在内存中。 Ruby 的方式是定义一个按需发出值的枚举器,而不是将它们全部存储在内存中。事实上,Ruby 已经提供了一个返回这个枚举器的函数。
-
你说你想要“每一个组合......”,但你的例子表明你想要每一个 repeated 组合或可能每一个 repeated permutaton。 (注意到目前为止发布的两个答案对问题的解释不同。)给定
a = [1,2,3],大小为2,组合(转换为字符串后)为["12", "13", "23"],重复组合为["11", "12", "13", "22", "23", "33"],排列为["12", "13", "21", "23", "31", "32"],重复排列为["11", "12", "13", "21", "22", "23", "31", "32", "33"]。请编辑澄清。