ruby - 如何生成给定长度的每个字母和数字组合的数组?

时间:2016-12-21 01:29:52

标签: arrays ruby

我正在尝试创建一个脚本,该脚本生成一个数组,列出用户提供的一定长度的字母和数字(以及最终符号)的每个重复排列。例如:

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的长度输入的废话。我该如何做到这一点?

2 个答案:

答案 0 :(得分:3)

alphanum = [*?a..?z, *?0..?9]
length.times.flat_map { |l|
  alphanum.repeated_permutation(l + 1).map(&:join)
}

请注意,length > 3会为您提供批次的结果。

编辑:正如梅加尔所说,这是非常耗费内存的。基于枚举器的答案(不是很漂亮,但不会扼杀你的记忆):

e = Enumerator.new do |y|
  length.times do |l|
    alphanum.repeated_permutation(l + 1).each do |p|
      y << p.join
    end
  end
end

答案 1 :(得分:1)

library(dplyr)
data_frame(V1, V2)
# A tibble: 3 × 2
#        V1        V2
#     <list>    <list>
#1 <chr [3]> <chr [4]>
#2 <chr [5]> <chr [2]>
#3 <chr [2]> <chr [5]>

请参阅Array#repeated_combination

对于&#34; permations&#34;而不是&#34;组合&#34;,找到并替换&#34;组合&#34;用&#34; permbos&#34;和&#34;组合&#34;用&#34;排列&#34;。