Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二进制序列组合生成器,Ruby语言_Ruby_Binary - Fatal编程技术网

二进制序列组合生成器,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”,而不是将“.”更改为“…”——这显然是在我这方面,我应该在更新后重新下载代码,而不是手动查看和更改。感谢您继续关注我的困惑!:-)这是迄今为止比较惯用的解决方案。