代码
def prune(arr, val)
arr.values_at(*(0..arr.size-4).reject { |i| arr[i][3] == val &&
arr[i+1..i+3].transpose[0,3].map(&:uniq).all? { |a| a.size==1 } }.
concat((arr.size-3..arr.size-1).to_a))
end
例
arr = [ [1,2,3,4,0],
[3,4,5,6,1],
[3,4,5,4,2],
[3,4,5,6,3],
[3,4,5,6,4],
[3,4,0,6,5],
[2,3,5,4,6],
[2,3,5,5,7],
[2,3,5,7,8],
[2,3,5,8,9],
[2,3,5,7,0]
]
注意的arr
元件(阵列)的最后的值是连续的。这是为了帮助您识别已被删除的prune(arr, 4)
(下文)的元素。
prune(arr, 4)
# => [[3, 4, 5, 6, 1],
# [3, 4, 5, 4, 2],
# [3, 4, 5, 6, 3],
# [3, 4, 5, 6, 4],
# [3, 4, 0, 6, 5],
# [2, 3, 5, 5, 7],
# [2, 3, 5, 7, 8],
# [2, 3, 5, 8, 9],
# [2, 3, 5, 7, 0]]
说明
在索引0
和6
的阵列还没有被包含在阵列返回。
arr[0]
([1,2,3,4,0]
)没有被包括在内,因为arr[0][3] = val = 4
和arr[1]
,arr[2]
和arr[3]
都开始[3,4,5]
。
arr[6]
([2,3,5,4,6]
)没有被包括在内,因为arr[6][3] = 4
和arr[7]
,arr[8]
和arr[9]
都开始[2,3,5]
。
arr[2]
([3,4,5,5,2]
)已被包括在内,因为,虽然arr[2][3] = 4
,arr[3][0,3]
,arr[4][0,3]
和arr[5][0,3]
所有不全部相等(即,arr[5][2] = 0
)。
请注意,arr
的最后三个元素将始终包含在返回的数组中。
现在让我们来看看计算。首先考虑以下几点。
arr.size
#=> 11
a = (0..arr.size-4).reject { |i| arr[i][3] == val &&
arr[i+1..i+3].transpose[0,3].map(&:uniq).all? { |a| a.size==1 } }
#=> (0..7).reject { |i| arr[i][3] == val &&
arr[i+1..i+3].transpose[0,3].map(&:uniq).all? { |a| a.size==1 } }
#=> [1, 2, 3, 4, 5, 7]
考虑为i=0
(召回val=4
)reject
的块的计算。
arr[i][3] == val && arr[i+1..i+3].transpose[0,3].map(&:uniq).all? {|a| a.size==1 }}
#=> 4 == 4 && arr[1..3].transpose[0,3].map(&:uniq).all? { |a| a.size==1 }
#=> [[3,4,5,6,1],
# [3,4,5,4,2],
# [3,4,5,6,3]].transpose[0,3].map(&:uniq).all? { |a| a.size==1 }
#=> [[3, 3, 3],
# [4, 4, 4],
# [5, 5, 5],
# [6, 4, 6],
# [1, 2, 3]][0,3].map(&:uniq).all? { |a| a.size==1 }
#=> [[3, 3, 3],
# [4, 4, 4],
# [5, 5, 5]].map(&:uniq).all? { |a| a.size==1 }
#=> [[3], [4], [5]].all? { |a| a.size==1 }
#=> true
含义arr[0]
将被拒绝;即不包括在返回的数组中。 其余的块计算(对于i=1,...,10
)是相似的。
我们计算
a #=> [1, 2, 3, 4, 5, 7]
这是除了最后3
将被保留的arr
所有元素的索引。到a
我们添加arr
的最后三个元素的索引。
b = a.concat((arr.size-3..arr.size-1).to_a)
#=> a.concat((8..10).to_a)
#=> a.concat([8,9,10])
#=> [1, 2, 3, 4, 5, 7, 8, 9, 10]
最后,
arr.values_at(*b)
返回在例子中给出的阵列。
我遇到的问题是,我的第一个数组从@projectsandtrials中删除,它不应该是......但其他一切都很好...... – bwatson30
请编辑一个小例子,包括您的预期结果。而不是数组大小为10,使它们更小 - 比如5个元素。如果您愿意,请随时使用我在答案中给出的例子。 –