-1

我有元素01. 我想获得它们可能变化的数组,每个变化的长度为k,其中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^1,2^22^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

由于您最多可以从 中获取两个元素[0, 1],因此从中获取两个以上的组合将为零。所以,

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 回答