たとえば、私は配列を持っています
g = [0,0,0,1,1,1,0,1,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1]
そしてその結果、私は必要です
f = [0,0,0,[1,1,1],0,[1,1],0,0,1,0,0,[1,1,1,1],0,0,0,[1,1,1]]
要素 (1) を結合する必要があるのは、それらが連続して 2 回以上出現する場合のみです。
たとえば、私は配列を持っています
g = [0,0,0,1,1,1,0,1,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1]
そしてその結果、私は必要です
f = [0,0,0,[1,1,1],0,[1,1],0,0,1,0,0,[1,1,1,1],0,0,0,[1,1,1]]
要素 (1) を結合する必要があるのは、それらが連続して 2 回以上出現する場合のみです。
これもうまくいきます:
g.chunk{ |e| e }.flat_map { |a, b| a == 0 || b.length == 1 ? b : [b] }
#=> [0, 0, 0, [1, 1, 1], 0, [1, 1], 0, 0, 1, 0, 0, [1, 1, 1, 1], 0, 0, 0, [1, 1, 1]]
g.inject([]) do |ary, i|
if i == 0 or ary.last == 0
ary << i
else
ary[-1] = Array(ary.last) << i
ary
end
end
=> [0, 0, 0, [1, 1, 1], 0, [1, 1], 0, 0, 1, 0, 0, [1, 1, 1, 1], 0, 0, 0, [1, 1, 1]]
これは O(n) ランタイムである必要があります。
参考までに:既に配列でない限り、配列 ( ) でArray(thing)
ラップします。thing
[thing]
セルジオ・トゥレンツェフのアイデアを実装
g = [0,0,0,1,1,1,0,1,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1]
f = []
ones = []
g.each { |x|
if x == 1
ones << x
else
if ones.size > 1
f << ones
elsif ones.size == 1
f += ones
end
ones = []
f << x
end
}
if ones.size > 1
f << ones
elsif ones.size == 1
f += ones
end
アップデート
別
g = [0,0,0,1,1,1,0,1,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1]
f = []
g.each { |x|
if x == 1
f << [] if ! f.last.is_a? Array
f.last << x
else
f << x
end
}
f.each_with_index { |x,i| f[i] = 1 if x == [1] }