Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Arrays_Iteration_Cross Product - Fatal编程技术网

ruby中区间叉积覆盖的迭代集

ruby中区间叉积覆盖的迭代集,ruby,arrays,iteration,cross-product,Ruby,Arrays,Iteration,Cross Product,我想这个答案以前有人问过,所以我搜索了一下,但什么也没找到。当然,有很多Ruby数组的问题,所以它可能就在那里,只是被掩埋了 在任何情况下,我都试图减少范围的叉积,返回满足某些条件的叉积的所有元素的总和。为了构造一个简单的示例,如果我有这样一个数组: [0..1,0..1,0..1] br = 0..1 br.reduce(0){|sumx, x| sumx + br.reduce(0){|sumy, y| sumy + br.reduce(0){|sumz, z|

我想这个答案以前有人问过,所以我搜索了一下,但什么也没找到。当然,有很多Ruby数组的问题,所以它可能就在那里,只是被掩埋了

在任何情况下,我都试图减少范围的叉积,返回满足某些条件的叉积的所有元素的总和。为了构造一个简单的示例,如果我有这样一个数组:

[0..1,0..1,0..1]
br = 0..1

br.reduce(0){|sumx, x|
  sumx + br.reduce(0){|sumy, y|
    sumy + br.reduce(0){|sumz, z|
      sumz + (x == 1 and z == 0 ? 1 : 0)
    }
  }
}
我想在这个集合上迭代:

[
  [0,0,0],
  [0,0,1],
  [0,1,0],
  [0,1,1],
  [1,0,0],
  [1,0,1],
  [1,1,0],
  [1,1,1]
]
并根据条件返回一个和“
如果i[0]==1和i[2]==0,则返回1”(这将给出2)。在我做作的例子中,我可以这样做:

[0..1,0..1,0..1]
br = 0..1

br.reduce(0){|sumx, x|
  sumx + br.reduce(0){|sumy, y|
    sumy + br.reduce(0){|sumz, z|
      sumz + (x == 1 and z == 0 ? 1 : 0)
    }
  }
}

,但在实际应用中,范围集可能要大得多,而这种嵌套方式将变得非常丑陋。有更好的方法吗?

有两个正交任务,请尽量不要将它们混淆,以便代码保持模块化

  • 如何构建N个数组的笛卡尔乘积

  • 如何过滤产品和计数

  • 用于获取笛卡尔乘积:

    xs = [0..1, 0..1, 0..1].map(&:to_a)
    xss = xs[0].product(*xs[1..-1]) # or xs.first.product(*xs.drop(1))
    #=> [[0, 0, 0], [0, 0, 1], [0, 1, 0], ..., [1, 1, 0], [1, 1, 1]]
    
    现在做过滤和过滤:

    xss.count { |x, y, z| x == 1 && z == 0 }
    #=> 2
    
    这比实际情况要难看一些,因为我们需要classmethod
    Array::product
    而不是方法
    Array\product
    。没问题,让我们将其添加到扩展模块中,最后编写:

    Array.product(0..1, 0..1, 0..1).count { |x, y, z| x == 1 && z == 0 }
    #=> 2
    

    有两个正交任务,请尽量不要将它们混淆,以便代码保持模块化

  • 如何构建N个数组的笛卡尔乘积

  • 如何过滤产品和计数

  • 用于获取笛卡尔乘积:

    xs = [0..1, 0..1, 0..1].map(&:to_a)
    xss = xs[0].product(*xs[1..-1]) # or xs.first.product(*xs.drop(1))
    #=> [[0, 0, 0], [0, 0, 1], [0, 1, 0], ..., [1, 1, 0], [1, 1, 1]]
    
    现在做过滤和过滤:

    xss.count { |x, y, z| x == 1 && z == 0 }
    #=> 2
    
    这比实际情况要难看一些,因为我们需要classmethod
    Array::product
    而不是方法
    Array\product
    。没问题,让我们将其添加到扩展模块中,最后编写:

    Array.product(0..1, 0..1, 0..1).count { |x, y, z| x == 1 && z == 0 }
    #=> 2
    

    谢谢,就是这个。构建笛卡尔积对我来说是很熟悉的,但是感谢使用数组折叠的解决方案,我忘记了块可以用这种方式将数组拆分为参数。谢谢,这就是它。构建笛卡尔积对我来说是很熟悉的,但多亏了使用数组折叠的解决方案,我忘记了块可以用这种方式将数组拆分为参数。