生成数字位的所有排列

时间:2014-02-03 22:21:24

标签: ruby arrays sorting split shuffle

我最近解决了一个问题,它需要一个3-4位数字,例如1234(以及一些更大的数字),并返回一个排序数组,其中包含所有可能的permutations数字{ {1}}

我不喜欢我的解决方案,因为它使用了时间来将数字添加到数组中,因此仍然容易犯错,而且更难看。有没有一种方法可以将数字添加到数组中完美的次数,这样一旦达到所有可能的数字混乱,程序将停止并返回数组?

[1234, 1432, 4213, 2431, 3412, 3214, etc.]

2 个答案:

答案 0 :(得分:4)

使用Array#permutation执行以下操作:

>> a = 1234.to_s.chars
=> ["1", "2", "3", "4"]
>> a.permutation(4).to_a
=> [["1", "2", "3", "4"],
 ["1", "2", "4", "3"],
 ["1", "3", "2", "4"],
 ["1", "3", "4", "2"],
 ["1", "4", "2", "3"],
 ["1", "4", "3", "2"],
 ["2", "1", "3", "4"],
 ["2", "1", "4", "3"],...]

您修改后的方法将是:

def number_shuffle(number,size)
  number.to_s.chars.permutation(size).to_a
end

答案 1 :(得分:1)

对于您的方法,它将是:

def number_shuffle(number)
  a = number.to_s.chars
  a.permutation(a.size).to_a.map { |b| b.join.to_i }
end

p number_shuffle 123 # => [123, 132, 213, 231, 312, 321]