我想变换数组
[3, 4, 8]
→ [3, 4, 8, 34, 38, 48, 43, 83, 84, 348, 384, 834, 843, 438, 483]
我尝试了
array.permutation
,但这只会返回[348, 384, 834, 843, 438, 483]
。有没有一种干净的方法可以做到这一点,而无需首先生成每个可能的子集?
Array#permutation
采用一个可选参数,告诉它要创建的最大排列大小。
就您而言,您只需要尺寸为
0
,然后是 1
,然后是 2
,... 直到您的 input.count
的所有排列。
因此,就像创建这些数字的范围一样简单,每次使用不同的数字调用
permutation
来映射它们,然后组合结果:
def all_permutations_of(input)
(1..input.count).flat_map do |permutation_length|
input.permutation(permutation_length).to_a
end
end
p all_permutations_of([3, 4, 8])
# => [
# [3], [4], [8],
# [3, 4], [3, 8], [4, 3], [4, 8], [8, 3], [8, 4],
# [3, 4, 8], [3, 8, 4], [4, 3, 8], [4, 8, 3], [8, 3, 4], [8, 4, 3],
# ]