2016-09-26 10 views
8

これを明確にする方法はわかりませんので、例を挙げます。配列の可能なすべてのディストリビューション(数字から)

私が書く場合:

some_method(["a", "b"], 3) 

私は

some_method(%w(a b c), 2) 

に渡すと予想される戻り値は

である必要があり、それは

[{"a" => 0, "b" => 3}, 
{"a" => 1, "b" => 2}, 
{"a" => 2, "b" => 1}, 
{"a" => 3, "b" => 0}] 

のいくつかのフォームを返したいのですが

[{"a" => 2, "b" => 0, "c" => 0}, 
{"a" => 1, "b" => 1, "c" => 0}, 
{"a" => 1, "b" => 0, "c" => 1}, 
{"a" => 0, "b" => 2, "c" => 0}, 
{"a" => 0, "b" => 1, "c" => 1}, 
{"a" => 0, "b" => 0, "c" => 2}] 

これは説明が難しいので、この質問にお答えいただきありがとうございます。ここで

+1

@smarx私はどこから始めようともまだ分かりません。 – clap

+2

あなたが何かを持っているときに戻ってきてください!スタックオーバーフローは、このような質問をするのに最適な場所ではありません。 http://stackoverflow.com/help/how-to-askを参照してください。 – smarx

+1

予想される出力に何らかのロジックがありますか?例えば、最初の出力に '{" a "=> 1、" b "=> 3}'がないのはなぜですか? –

答えて

7

は、これを行うための一つの方法です:

def some_method ary, num 
permutations = (0..num).to_a.repeated_permutation(ary.size).select do |ary| 
    ary.reduce(:+) == num 
end 

return permutations.map { |a| (ary.zip a).to_h } 
end 

p some_method ["a", "b"], 3 
#=> [{"a"=>0, "b"=>3}, {"a"=>1, "b"=>2}, {"a"=>2, "b"=>1}, {"a"=>3, "b"=>0}] 
p some_method %w(a b c), 2 
#=> [{"a"=>0, "b"=>0, "c"=>2}, {"a"=>0, "b"=>1, "c"=>1}, {"a"=>0, "b"=>2, "c"=>0}, {"a"=>1, "b"=>0, "c"=>1}, {"a"=>1, "b"=>1, "c"=>0}, {"a"=>2, "b"=>0, "c"=>0}] 

は、このメソッドは、再帰を使用しています@seph

+2

ニース。私はあなたが 'repeated_permutation'を使用していると思います。 – seph

+0

ありがとうございます@seph - 私はその方法について知りませんでした。今はうまくいっているようだ。 –

+0

@CarySwoveland - 明白なreturn文のようなことがあります。私はそれがオプションであることに同意します。 –

5

によって先端に基づいて回答を更新しました。

def meth(keys_remaining, total_remaining) 
    first_key, *rest_keys = keys_remaining 
    return [{ first_key=>total_remaining }] if rest_keys.empty? 
    (0..total_remaining).flat_map { |n| 
    meth(rest_keys, total_remaining-n).map { |g| { first_key=>n }.merge(g) } } 
end 

meth ["a", "b", "c"], 2 
    #=> [{"a"=>0, "b"=>0, "c"=>2}, {"a"=>0, "b"=>1, "c"=>1}, {"a"=>0, "b"=>2, "c"=>0}, 
     {"a"=>1, "b"=>0, "c"=>1}, {"a"=>1, "b"=>1, "c"=>0}, {"a"=>2, "b"=>0, "c"=>0}] 

meth ["a", "b", "c", "d"], 4 
    #=> [{"a"=>0, "b"=>0, "c"=>0, "d"=>4}, {"a"=>0, "b"=>0, "c"=>1, "d"=>3}, 
    # {"a"=>0, "b"=>0, "c"=>2, "d"=>2}, {"a"=>0, "b"=>0, "c"=>3, "d"=>1}, 
    # {"a"=>0, "b"=>0, "c"=>4, "d"=>0}, {"a"=>0, "b"=>1, "c"=>0, "d"=>3}, 
    # {"a"=>0, "b"=>1, "c"=>1, "d"=>2}, {"a"=>0, "b"=>1, "c"=>2, "d"=>1}, 
    # {"a"=>0, "b"=>1, "c"=>3, "d"=>0}, {"a"=>0, "b"=>2, "c"=>0, "d"=>2}, 
    # {"a"=>0, "b"=>2, "c"=>1, "d"=>1}, {"a"=>0, "b"=>2, "c"=>2, "d"=>0}, 
    # {"a"=>0, "b"=>3, "c"=>0, "d"=>1}, {"a"=>0, "b"=>3, "c"=>1, "d"=>0}, 
    # {"a"=>0, "b"=>4, "c"=>0, "d"=>0}, {"a"=>1, "b"=>0, "c"=>0, "d"=>3}, 
    # {"a"=>1, "b"=>0, "c"=>1, "d"=>2}, {"a"=>1, "b"=>0, "c"=>2, "d"=>1}, 
    # {"a"=>1, "b"=>0, "c"=>3, "d"=>0}, {"a"=>1, "b"=>1, "c"=>0, "d"=>2}, 
    # {"a"=>1, "b"=>1, "c"=>1, "d"=>1}, {"a"=>1, "b"=>1, "c"=>2, "d"=>0}, 
    # {"a"=>1, "b"=>2, "c"=>0, "d"=>1}, {"a"=>1, "b"=>2, "c"=>1, "d"=>0}, 
    # {"a"=>1, "b"=>3, "c"=>0, "d"=>0}, {"a"=>2, "b"=>0, "c"=>0, "d"=>2}, 
    # {"a"=>2, "b"=>0, "c"=>1, "d"=>1}, {"a"=>2, "b"=>0, "c"=>2, "d"=>0}, 
    # {"a"=>2, "b"=>1, "c"=>0, "d"=>1}, {"a"=>2, "b"=>1, "c"=>1, "d"=>0}, 
    # {"a"=>2, "b"=>2, "c"=>0, "d"=>0}, {"a"=>3, "b"=>0, "c"=>0, "d"=>1}, 
    # {"a"=>3, "b"=>0, "c"=>1, "d"=>0}, {"a"=>3, "b"=>1, "c"=>0, "d"=>0}, 
    # {"a"=>4, "b"=>0, "c"=>0, "d"=>0}] 
関連する問題