Ruby中的二进制序列组合生成器

时间:2011-12-04 00:56:51

标签: ruby binary

代码有效,但感觉非常蛮力,建议?

代码的目标是提供数组长度,然后尽可能快地生成具有该数组长度的所有可能的唯一二进制组合。

CODE:

class Array
  def sequence(i = 0, *a)
    return [a] if i == size
    self[i].map {|x|
      sequence(i+1, *(a + [x]))
    }.inject([]) {|m, x| m + x}
  end
end


[(0..1),(0..1),(0..1)].sequence

输出:

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

2 个答案:

答案 0 :(得分:6)

置换permutation和repeated_permutation,所以你可以这样做:

def sequence(n)
  [0, 1].repeated_permutation(n).to_a
end
p sequence(3) #=>[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

答案 1 :(得分:2)

带有n位的“所有唯一二进制组合”只是(0 ... 2 ** n),因此唯一的任务是有效地从整数转换为其二进制表示,以下是一个解决方案不依赖于字符串生成/操作:

def sequence(n)
  ret = []
  (2**n).times do |number|
    ret << []
    (n - 1).downto(0) do |bit|
      ret.last << number[bit]
    end
  end

  ret
end

sequence(3) 
# => [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

或者,如果您更喜欢更符合列表操作的版本,这几乎是相同的:

def sequence(n)
  (0...2**n).map {|number|
    (1..n).map {|bit|
      number[n-bit]
    }
  }
end