ruby在数组中查找条目

时间:2014-08-30 07:42:03

标签: ruby arrays math

我有一些数组

[0,1,0,1,0]
[0,0,1,1,0]
[1,1,0,1,1]

和一些面具

[1,0]
[0,1]

我应该用什么方法通过掩码查找序列?

样本数组可以是任何大小,掩码也可以是任何大小

我需要一些策略或数学解决方案

2 个答案:

答案 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]]