Enumerable#chunk будет отличным вариантом для этого.
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]
p g.chunk{|i| i == 0}.to_a
# >> [[true, [0, 0, 0]], [false, [1, 1, 1]], [true, [0]],
# [false, [1, 1]], [true, [0, 0]], [false, [1]],
# [true, [0, 0]], [false, [1, 1, 1, 1]],
# [true, [0, 0, 0]], [false, [1, 1, 1]]]
ar = g.chunk{|i| i == 0}.each_with_object([]) do |(e1,e2),a|
(!e1 && e2.size > 1) ? a.concat([e2]) : a.concat(e2)
end
p ar
# >> [0, 0, 0, [1, 1, 1], 0, [1, 1], 0, 0, 1, 0, 0,
# [1, 1, 1, 1], 0, 0, 0, [1, 1, 1]
Benchmark
require 'benchmark'
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]
n = 1000000
Benchmark.bm(15) do |x|
x.report('stefan') { n.times { g.chunk{ |e| e }.flat_map { |a, b| a == 0 || b.length == 1 ? b : [b] } } }
x.report('priti') { n.times { g.chunk{|i| i == 0}.each_with_object([]){|(e1,e2),a| (!e1 && e2.size > 1) ? a.concat([e2]) : a.concat(e2)} } }
x.report('tessi') { n.times { g.inject([]) { |ary, i| (i == 0 or ary.last == 0) ? ary << i : (ary[-1] = Array(ary.last) << i); ary }}}
end
user system total real
stefan 11.860000 0.000000 11.860000 (11.890553)
priti 13.360000 0.000000 13.360000 (13.406585)
tessi 5.650000 0.000000 5.650000 ( 5.666377)
Итак, где ты застрял? –
Просто не знаю, как это сделать. – DenisKo
Ну, вот идея: проведите через свой исходный массив и проверьте элементы. Если это не '1', добавьте его в массив результатов. Если это '1', добавьте его во временный массив. Если это еще не '1', добавьте этот массив temp в массив результатов. –