我正在尝试创建一个脚本来生成一个数组,该数组列出了用户提供的一定长度的字母和数字(最终是符号)的每个重复排列。例如:
User input: 4
Output:
a
b
...
zzzy
zzzz
我尝试了多种方法来实现此目的,并通过在包含 a-z 和 0-9 的数组上嵌套 .each 循环获得了我正在寻找的效果。
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
但是,这不能通过输入来确定,并且对我来说似乎效率不高或没有 ruby 风格。我尝试了各种其他循环组合,但似乎都不起作用。一个例子:
# 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 的废话。我该如何完成此操作?
最佳答案
alphanum = [*?a..?z, *?0..?9]
length.times.flat_map { |l|
alphanum.repeated_permutation(l + 1).map(&:join)
}
请注意,length > 3
将为您提供很多结果。
编辑:正如 meagar 所说,这非常占用内存。基于枚举器的答案(不太漂亮,但不会破坏你的内存):
e = Enumerator.new do |y|
length.times do |l|
alphanum.repeated_permutation(l + 1).each do |p|
y << p.join
end
end
end
关于arrays - ruby - 如何生成给定长度的字母和数字的每种组合的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253805/