コードarr
の要素(アレイ)の最後の値が連続していること
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]
]
注意:ここではオプションです。これは、削除された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
におけるアレイは、アレイに返さ含まれていません。すべての[3,4,5]
を開始arr[0][3] = val = 4
とarr[1]
、arr[2]
とarr[3]
ので
arr[0]
([1,2,3,4,0]
)が含まれていません。すべての[2,3,5]
を開始arr[6][3] = 4
とarr[7]
、arr[8]
とarr[9]
ので
arr[6]
([2,3,5,4,6]
)が含まれていません。 (即ち、arr[5][2] = 0
)arr[2][3] = 4
、arr[3][0,3]
、arr[4][0,3]
とarr[5][0,3]
ながらすべてではない全て等しいので
arr[2]
([3,4,5,5,2]
)が含まれています。
arr
の最後の3つの要素は、常に返される配列に含まれることに注意してください。
ここで、計算を調べてみましょう。最初に以下を考えてみましょう。
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[0]
は拒否されます。つまり、返された配列には含まれません。 残りのブロック計算(i=1,...,10
の場合)は似ています。
我々は保持される最後の3
除くarr
のすべての要素のインデックスである
a #=> [1, 2, 3, 4, 5, 7]
を計算しています。 a
には、最後の3つの要素、すなわち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つの要素を小さくします。あなたが望むなら、私が私の答えで与えた例を自由に使ってください。 –