二进制序列组合生成器,Ruby语言
代码是有效的,但感觉非常暴力,建议 代码的目标是提供一个数组长度,然后尽可能快地使用该数组长度生成所有可能的唯一二进制组合 代码:二进制序列组合生成器,Ruby语言,ruby,binary,Ruby,Binary,代码是有效的,但感觉非常暴力,建议 代码的目标是提供一个数组长度,然后尽可能快地使用该数组长度生成所有可能的唯一二进制组合 代码: 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)
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]]
输出:
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]]
具有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, 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]]
既然您刚从中获取了这段代码,您希望它做什么?这段代码不起作用,因为输出不是一个排列列表。@Krzysztof Chrobak这怎么不是一个排列列表?@dominikh-排列应该是内射的,并且输出的每个子列表中的值出现不止一次。但是,我可能误解了这段代码的目的。@DownVoter,VoteToClose:请就这个问题的错误表达您的想法。谢谢不要使用
.foo-1
,而要使用…foo
:-)@现在你把我弄糊涂了:)马克·安德烈建议使用a…b
而不是a…b-1
,注意这三个点,它排除了最后一个元素。他们做的事情完全一样。事实上,这不是一个bug,只是一个样式问题<顺便说一句,code>(2**n).times.map也可以完成这项工作。此外,使用n.downto(1).map
可以更清楚地避免后面的减法。在任何情况下,这个解决方案都是有效的,并且可读性很强。@dominikh:Bug是在我这方面,只注意删除了“-1”,而不是将“.”更改为“…”——这显然是在我这方面,我应该在更新后重新下载代码,而不是手动查看和更改。感谢您继续关注我的困惑!:-)这是迄今为止比较惯用的解决方案。