-1

私は要素0とを持っています1k各バリエーションの長さが、ここで、可能なバリエーションの配列を取得したいk = 2^(2^n) (n = 0, 1, 2, ...)。現在、私はこれを行います:

case k
  when 2  then ['0', '1']
  when 4  then [0, 1].product([0, 1]).map(&:join)
  when 16 then [0, 1].product([0, 1]).product([0, 1]).map(&:flatten).product([0, 1]).map(&:flatten).map(&:join)
end

しかし、これはエレガントではありません。かかる良い解決策は何kですか?私は2^12^2、およびに対してのみ機能し2^4ます。

4

3 に答える 3

4

これらは、0 から N-1 までの整数の単なるバイナリ表現です...

irb(main):008:0> 16.times.map {|x| "%04b" % x }
=> ["0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"]
irb(main):009:0> 4.times.map {|x| "%02b" % x }
=> ["00", "01", "10", "11"]
irb(main):010:0> 2.times.map {|x| "%01b" % x }
=> ["0", "1"]

一般に 2 nの場合:

irb(main):014:0> n=3; (1<<n).times.map {|x| "%0*b" % [n, x] }
=> ["000", "001", "010", "011", "100", "101", "110", "111"]

質問が示すものとはまったく異なる概念であるn 個の要素のk 個の組み合わせが本当に必要な場合、 Ruby には既にそのメソッドがあります。

irb(main):023:0> [1,2,3,4].combination(2).to_a
=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
于 2013-11-08T14:49:18.140 に答える
1

からは最大で 2 つの要素を取得できるため、2 つ[0, 1]以上の要素を取得する組み合わせは 0 になります。したがって、

case k
when 2 then [[0, 1]]
else []
end
于 2013-11-08T15:05:05.787 に答える
1

KennyTM の答えは結構です。結果は、繰り返しのある順列です。より柔軟性が必要な場合、Array にはそのためのメソッドがあります。

[0,1].repeated_permutation(4).map(&:join)
#=> ["0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"]
于 2013-11-08T15:06:16.617 に答える