私はあなたの質問を理解しているので(そしてこれは他の人がそれを理解した方法とは異なります)、配列の個々の要素(文字)が順序を維持する配列の可能なすべてのグループ化(パーティション化)が必要です(常に'a'
、次に'b'
、次に'c'
、 ... 'f'
)。これは、各パーティションのサイズの順序付けられたリストのセットを取得する問題であると考えました。
つまり、最初に 3 つのパーティショニングの例を次のように表します。
[[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"]]]
私の理解が正しければ、まさにあなたが求めているものです。