2014-08-30 212 views
0

進入我有一些陣紅寶石發現陣列

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

及面具

[1,0] 
[0,1] 

什麼方法,我應該用它來找到面具序列?

樣品陣列可以是任意大小和掩碼可以是任何尺寸過

我需要一些策略或數學解決方案

+1

我不認爲我明白這個問題。在上面的例子中,輸出應該是什麼? – jcm 2014-08-30 07:45:53

+0

類似於x = 1,y = 0的東西,在這種情況下,左上角的位置已經足夠了 – 2014-08-30 07:47:45

回答

1

我不太明白的問題,但是這是你在找什麼:

a = [0,1,0,1,0] 
b = [1,0] 
x = a.each_cons(b.length).map { |i| i == b}.index(true) 

您還可以first取代index(true)

+1

謝謝,它對3個元素很好用 'x = a.each_cons(b.length).map do | aa | aa == b end.index(true)' – 2014-08-30 08:23:34

+1

不客氣。感謝您糾正我。我假定數組總是通過使用'[i,j]'有2個成員。 ;-)我糾正了它。 – Adrian 2014-08-30 08:36:44

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] 

    ([email protected]_rows+1).times.with_object([]) do |i,seq| 
    j = 0 
    while j <= [email protected]_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: [email protected]_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]]