据我了解您的问题(这与其他人的理解不同),您希望数组的每个可能的分组(分区)数组的各个元素(字符)保持其顺序(总是'a'
,然后'b'
,然后'c'
, ... 'f'
)。我认为这是获取每个分区大小的有序列表集的问题。
也就是说,我首先将您的三个示例分区表示为:
[[1, 5],
[2, 4],
[2, 2, 2],
...]
所以我首先生成:
[[6], [1, 5], [2, 4], [3, 3] ...]
然后用它来生成最终结果。
我生成尺寸的方式非常低效。这是首先想到的,它适用于您的阵列,但如果需要处理更大的阵列,则需要更好的算法。(sawa 现在提供了一种更短、更有效的解决方案。)
def sizes(n)
(1..n).each_with_object([]) do |i, sizes|
sizes.concat (1..n).to_a.repeated_permutation(i).select{|a| a.reduce(:+) == n}
end
end
def partitions_of(a)
sizes(a.size).each_with_object([]) do |sizes, results|
dup = a.dup
results << sizes.each_with_object([]) do |size, result|
result << dup.shift(size)
end
end
end
使用你的数组,这个:
partitions_of(['a', 'b', 'c', 'd', 'e', 'f'])
产生这个:
[[["a", "b", "c", "d", "e", "f"]],
[["a"], ["b", "c", "d", "e", "f"]],
[["a", "b"], ["c", "d", "e", "f"]],
[["a", "b", "c"], ["d", "e", "f"]],
[["a", "b", "c", "d"], ["e", "f"]],
[["a", "b", "c", "d", "e"], ["f"]],
[["a"], ["b"], ["c", "d", "e", "f"]],
[["a"], ["b", "c"], ["d", "e", "f"]],
[["a"], ["b", "c", "d"], ["e", "f"]],
[["a"], ["b", "c", "d", "e"], ["f"]],
[["a", "b"], ["c"], ["d", "e", "f"]],
[["a", "b"], ["c", "d"], ["e", "f"]],
[["a", "b"], ["c", "d", "e"], ["f"]],
[["a", "b", "c"], ["d"], ["e", "f"]],
[["a", "b", "c"], ["d", "e"], ["f"]],
[["a", "b", "c", "d"], ["e"], ["f"]],
[["a"], ["b"], ["c"], ["d", "e", "f"]],
[["a"], ["b"], ["c", "d"], ["e", "f"]],
[["a"], ["b"], ["c", "d", "e"], ["f"]],
[["a"], ["b", "c"], ["d"], ["e", "f"]],
[["a"], ["b", "c"], ["d", "e"], ["f"]],
[["a"], ["b", "c", "d"], ["e"], ["f"]],
[["a", "b"], ["c"], ["d"], ["e", "f"]],
[["a", "b"], ["c"], ["d", "e"], ["f"]],
[["a", "b"], ["c", "d"], ["e"], ["f"]],
[["a", "b", "c"], ["d"], ["e"], ["f"]],
[["a"], ["b"], ["c"], ["d"], ["e", "f"]],
[["a"], ["b"], ["c"], ["d", "e"], ["f"]],
[["a"], ["b"], ["c", "d"], ["e"], ["f"]],
[["a"], ["b", "c"], ["d"], ["e"], ["f"]],
[["a", "b"], ["c"], ["d"], ["e"], ["f"]],
[["a"], ["b"], ["c"], ["d"], ["e"], ["f"]]]
如果我理解正确,这正是您所追求的。