迭代存储在两个地方的三个值

时间:2014-08-28 22:20:03

标签: ruby arrays loops hash

编辑了一些。这是一个较大的加工件的小样本。我的解谜逻辑需要检查一个人的五个属性中的一个与他的四个邻居的五个属性之一。这个例子只显示了三个。在$ hash1中,真值表,行是人,列是属性。我们假设管理属性 - 我将保留该信息,因为它不是这个的核心。

$ hash1 [2] [2]是'edge',所以它只需要检查一个邻居,$ hash [6] [value1]

$ hash1 [5] [2]是一个'中间',所以它需要检查两个邻居,$ hash [3] [value2]和$ hash [9] [value2]

$ hash1中的值为9表示nil,1表示true,0表示false

所以,在这种情况下,“穿红衬衫的男人住在驾驶福特的男人旁边”

如果我们要检查是否已分配红色衬衫,我们需要查看键2,5,8。当逻辑命中$ hash1 [5] [2],红色衬衫为1时,逻辑将检查一个邻居是否为零而另一个邻居有一辆不是福特的汽车。如果这是真的,零汽车将被设置为福特。

 $hash1 = {1 => [9,9,9],  2 => [9,9,9],  3 => [9,9,9],
           4 => [9,9,9],  5 => [9,1,9],  6 => [9,9,9],
           7 => [9,9,9],  8 => [9,9,9],  9 => [9,9,1], 99 => [1,1,1]}

 $arry1 = [2,5,8]

 $hash2 = { 6 => 99, 3 => 9, 99 => 6}

(条目99是允许代码使用相同的边缘检查机制作为中间,因为如果它是最后的人,那么他只有一个邻居,所以如果他有一件红色衬衫,他的邻居肯定驾驶福特。)

我需要它总共循环三次:

checking 2 and 6 , 99
then     5 and 3 , 9
then     8 and 99 , 6

除了从两个不同的地方循环使用三个值之外,我已经完成了所有工作 - 我现在正在修补它 -

    $arry1.zip($hash2).map(&:flatten).each |key,key2,key3|

除了它正在做的是把它们合并到这个:

 <2, 6, 99> <5, 99, 6> <8>

对于更长的数组,相同的模式 - 第一个和最后一个哈希对进入并与前两个数组值配对,其余的数组值保持不变。

1 个答案:

答案 0 :(得分:1)

假设您的代码已完成,您应该可以替换:

val1.each do |key1|
  val2.each do |key2,key3|

val1.zip(val_2).map(&:flatten).each do |key1, key2, key3|

附加说明:当您完成解决问题后,请将其发布到codereview.stackexchange.com`,这样我们就能闻到气味。 :)