Ruby的数组组合方法

5

我正在完成Ruby Monk的Ruby Primer问题。

问题陈述:给定一个由不同数字组成的3位或4位数,返回一个排序后的数组,其中包含使用这些数字可以形成的所有唯一数字。例如:给定:123 返回:[123, 132, 213, 231, 312, 321]

我认为Array#combination方法可以解决问题。我的代码看起来像这样:

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)

但是上面的代码返回:
1
2
3

我不确定在这里做错了什么,我认为文档已经很清楚了:

http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-combination

欢迎任何帮助。


对于 number = 123,你计算 [1,2,3].combination(3).to_a => [[1,2,3]] 并且 puts [[1,2,3]] 会在连续的行上打印 123。相比之下,p [[1,2,3]] 打印 [[1, 2, 3]] 在一行上。你得到这个结果是因为每个数组 a 只有一个大小为 a.size 的组合,即 a,所以返回 [a]。另一方面,[1,2,3].combination(1).to_a => [[1], [2], [3]][1,2,3].combination(2) => [[1, 2], [1, 3], [2, 3]]。我认为你知道需要使用 permutation 而不是 combination - Cary Swoveland
3个回答

1

与其使用Array#combination,您需要Array#permutation

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"]

谢谢大家,但现在我不明白组合方法是做什么的。 - Steven L.
请查看http://www.mathsisfun.com/combinatorics/combinations-permutations.html。另外,在选择解决方案时,当“number = 122”时,结果应该是什么? - Matt
2
了解“组合”和“排列”的区别最好的方法就是用两种方式评估一个数组,看看得到什么结果:[1,2,3].combination(2).to_a => [[1, 2], [1, 3], [2, 3]][1,2,3].permutation(2).to_a => [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]。你可以看到,在组合[1, 2]中,有两个排列[1, 2][2, 1]。对于来自[1,2,3,4].combination(3).to_a的组合[1,2,4],有六个(3x2)排列:[1,2,4][1,4,2][2,1,4][2,4,1][4,1,2][4,2,1] - Cary Swoveland
@CarySwoveland,我从数学角度理解你的意思,但是我的原始帖子中的代码返回1、2、3,根本没有任何组合。还有一些东西缺失。 - Steven L.
@user245185 [1,2,3].combination(3).to_a # => [[1, 2, 3]]。将此与[1,2,3].combination(2).to_a # => [[1, 2], [1, 3], [2, 3]]进行比较。在第一种情况下,只有1种长度为3的组合。在第二种情况下,有3种长度为2的组合。 - Matt

1
您可以使用Array#permutation获取字符数组的排列组合:
def number_shuffle(number)
  number.to_s.chars.permutation.map { |x| x.join.to_i }.sort
end

0
对于 Ruby Monk 的问题,你需要使用 Array.permutations。Array.permutation(n) 是一个数组中从 n 个元素中取出所有可能的排列数量。
例如:[1,2,3] 当 n = 1 时结果是 1, 2, 3;当 n = 2 时结果是 [1,2] [2,1] [1,3] [3,1] [2,3] [3,2]。
所以你需要使用 Array.permutations 这个函数。
   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]。这就是为什么您的代码只返回一种组合的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接