[Q] how to do insertion and smooth traversal simultaneously on array

(SHIGETOMI, Takuhiko) #1

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.

do anyone know cool way for that?

ttsp://void/3d/universe/milky-way-galaxy/orion-arm/sol-solar-system/
3rd-planet/fareast/jp/tky/shigetomi.takuhiko.5618

(Robert) #2

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.

do anyone know cool way for that?

The easiest is probably to use the index for iterating and adjust it on
insertions. The alternative is to remember insertions and apply them
after the iteration (probably in reverse order to avoid complicated index
calculations).

Kind regards

    robert

(W. James) #3

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]