我有一些数组
[0,1,0,1,0]
[0,0,1,1,0]
[1,1,0,1,1]
和一些面具
[1,0]
[0,1]
我应该用什么方法通过掩码查找序列?
样本数组可以是任何大小,掩码也可以是任何大小
我需要一些策略或数学解决方案
答案 0 :(得分:1)
我不太明白这个问题,但这就是你要找的东西:
a = [0,1,0,1,0]
b = [1,0]
x = a.each_cons(b.length).map { |i| i == b}.index(true)
您也可以将index(true)
替换为first
。
答案 1 :(得分:1)
此问题适合使用Matrix
类,特别是使用方法Matrix#minor。
对于给定的"主要"并且"掩盖"对于矩阵,下面的方法为主矩阵的每一行提取子序列中每个元素等于掩蔽矩阵的所有子矩阵序列。
<强>代码强>
require 'matrix'
def find_sequences(arr, mask)
arr_rows = arr.size
arr_cols = arr.first.size
@mask_rows = mask.size
@mask_cols = mask.first.size
m_arr = Matrix[*arr]
@m_mask = Matrix[*mask]
(arr_rows-@mask_rows+1).times.with_object([]) do |i,seq|
j = 0
while j <= arr_cols-@mask_cols do
len = row_sequence(m_arr.minor(i,@mask_rows,j,arr_cols-j))
if len > 0
seq << [i,j,len]
j += len * @mask_cols + 1
else
j += 1
end
end
end
end
def row_sequence(msub)
len = 0
0.step(by: @mask_cols, to: msub.column_count-@mask_cols) { |j|
(msub.minor(0,@mask_rows,j,@mask_cols) == @m_mask) ?
(len += 1) : (return len) }
len
end
示例强>
arr = [[0,1,0,1,0,0,1,0,0],
[0,0,1,1,0,1,0,1,0],
[1,0,1,0,1,0,1,0,1],
[0,1,0,1,0,1,0,1,1],
[1,0,1,0,1,1,0,1,1]]
mask = [[1,0],
[0,1]]
find_sequences(arr, mask)
#=> row col len
# [[0, 1, 1],
# [0, 6, 1],
# [1, 3, 3],
# [2, 0, 4],
# [3, 1, 2]]