From: William James Date: 2005-09-06T17:46:31+09:00 Subject: Re: how to do insertion and smooth traversal simultaneously on array SHIGETOMI, Takuhiko wrote: > greetings, guys. > > this is a pseudo-ruby code which shows what i am expecting. > > a = [ 0, 1, 2, 3, 4, 5 ] > a.each_with_index do |x, i| > puts "[#{i}] : #{x}" > if i % 2 == 0 # even index ? > a.insert( i, ':-)' ) > skip 1 # <- this is a pseudo directive to skip the next element > # which has just been inserted now > end > end > puts a.size > > expected output... > > [0] : 0 > [1] : 1 > [2] : 2 > [3] : 3 > [4] : 4 > [5] : 5 > 9 <-- means that 3 smileys have been inserted > > as above, i want to traverse an array with some conditional insertion to > itself. If the array is "flat": ----------------------------------------- a = [ 0, 1, 2, 3, 4, 5 ] a.each_with_index do |x, i| if i % 2 == 0 # even index ? a[i] = [ ":-)", x ] end end a.flatten! p a ----------------------------------------- [":-)", 0, 1, ":-)", 2, 3, ":-)", 4, 5] If the array isn't flat: ----------------------------------------- a = [ [81,"&"], 82, 83, [84,"@"], 85 ] a = (0...a.size).to_a.zip(a) p a a = a.inject([]) { |ary,x| if x[0] % 2 == 0 # even index ? ary += [ ":-)", x[1] ] else ary << x[1] end } p a ----------------------------------------- [[0, [81, "&"]], [1, 82], [2, 83], [3, [84, "@"]], [4, 85]] [":-)", [81, "&"], 82, ":-)", 83, [84, "@"], ":-)", 85]