0

たとえば、私は配列を持っています

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 回以上出現する場合のみです。

4

4 に答える 4

3

これもうまくいきます:

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]]
于 2013-07-24T13:01:47.917 に答える
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]

于 2013-07-24T12:21:01.337 に答える
0

セルジオ・トゥレンツェフのアイデアを実装

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] }
于 2013-07-24T11:42:50.350 に答える