«Все уникальные двоичные комбинации» с 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