Ruby';s阵列组合法

Ruby';s阵列组合法,ruby,arrays,Ruby,Arrays,我正在研究Ruby Monk的Ruby Primer的问题 问题陈述 给定一个具有不同数字的3位或4位数字,返回可由这些数字组成的所有唯一数字的排序数组。 例子: 给定值:123 返回:[123、132、213、231、312、321] 我认为数组组合方法会起作用。我的代码如下所示: def number_shuffle(number) # take integer and turn it into an array of digits digits = Array.new num

我正在研究Ruby Monk的Ruby Primer的问题

问题陈述 给定一个具有不同数字的3位或4位数字,返回可由这些数字组成的所有唯一数字的排序数组。 例子: 给定值:123 返回:[123、132、213、231、312、321]

我认为数组组合方法会起作用。我的代码如下所示:

def number_shuffle(number)
  # take integer and turn it into an array of digits
  digits = Array.new

  number.to_s.split('').each do |element|
    digits << element.to_i
  end

  # shuffle the elements
  return digits.combination(digits.length).to_a
end

puts number_shuffle(123)
不知道我做错了什么。我认为文件说明了这一点:

感谢您的帮助

您希望:


您可以使用以下方法获得字符数组的排列:


对于ruby monk问题,您需要的是Array.permutations。排列(n)是一个数组一次取n的可能排列数。 n=1的[1,2,3]将是1,2,3 n=2的[1,2,3]将是[1,2][2,1][1,3][3,1][2,3][3,2]

你需要的是

   Array.permutations(Array.length)
Array.combination(n)返回从数组中取出n个对象时可以从数组中进行的唯一选择数

对于数组[1,2,3],如果n=1。一次只能取出一个元素 可能的选择有1、2和3

对于数组[1,2,3],如果n=2。一次可以取出两个元素。 可能的选择是[1,2]、[1,3]和[2,3]

您已将数组的长度指定为N(N=Array.length)

因此,在[1,2,3]的情况下,如果n=3,则只有一种方法可以得出 使用所有元素进行选择。
即[1,2,3]。这就是为什么您的代码只返回一个组合。

谢谢各位,但现在我不明白组合方法的作用。请参阅。另外,当选择一个解决方案时,当
number=122
时,结果应该是什么?理解
组合和
置换之间区别的最好方法是只对数组进行双向求值,看看得到什么:
[1,2,3]。组合(2)。to_a=>[1,2],[1,3],[2,3]
[1,2,3]。排列(2)。to_a=>[[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]
。您可以看到,对于组合
[1,2]
有两种排列
[1,2]
[2,1]
。对于组合
[1,2,4]
,来自
[1,2,3,4]。组合(3)。对于a
有六(3x2)种排列:
[1,2,4]
[1,4,2]
[2,1,4]
[2,4,2]
[4,1,2]
,以及
[4,2,1]
,我从数学的角度理解你的意思,但是我的原始帖子中的代码返回1、2、3,并且根本没有组合。这里仍然缺少一些东西。@user245185
[1,2,3]。组合(3)。to_a#=>[[1,2,3]]
。将其与[code>[1,2,3]进行比较。组合(2)。to_a#=>[1,2],[1,3],[2,3]
。在第一种情况下,只有1个组合有3个元素长。在第二种情况下,有三种长度为2个元素的组合。对于
number=123
,您计算
[1,2,3]。组合(3)。to_a=>[1,2,3]
put[[1,2,3]
将在连续行上打印
1
2
3
。相比之下,
p[[1,2,3]]
在一行上打印
[[1,2,3]]]
。得到这个结果是因为每个数组
a
只有一个size
a.size
的组合,即
a
,因此返回
[a]
。另一方面,
[1,2,3]。组合(1)。to_a=>[1],[2],[3]
[1,2,3]。组合(2)=>[1,2],[1,3],[2,3]
。我相信您知道您需要使用
排列
而不是
组合
number = 123
number.to_s.split('').permutation.map(&:join).uniq.sort
# => ["123", "132", "213", "231", "312", "321"]

number = 122
number.to_s.split('').permutation.map(&:join).uniq.sort
# => ["122", "212", "221"]
def number_shuffle(number)
  number.to_s.chars.permutation.map { |x| x.join.to_i }.sort
end
   Array.permutations(Array.length)