Вырезать элементы массива перед парой значений - PullRequest
0 голосов
/ 03 февраля 2019

Имея массив «а», я хочу найти пару значений в массиве «а».«02», затем «10», и, если найдено, я хочу создать 2 новых массива, один из которых начинается с «02», «10», а другой начинается с 3 позиций после «02», «10».

a = ["11", "45", "01", "01", "02", "00", "10", "4C", "02", "10", "00", "42", "00", "00", "26"]

Если я смотрю индексы 02 и 10 по отдельности, я получаю 4 и 6 соответственно, но индекс пары "02", "10" равен 8.

irb(main)> a.index("02")
=> 4
irb(main)> a.index("10")
=> 6

Желаемый результат будеткак это:

b = ["02", "10", "00", "42", "00", "00", "26"]

c = ["00", "00", "26"]

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Чтобы позволить ему работать с большим количеством вхождений ["02", "10"], условно украденный у @Cary Swoveland, ответ:)

def split_strange(ary)
  res = []
  (ary.size - 1).times do |i|
    res << [ary[i..-1], ary[i+4..-1]] if [ary[i], ary[i+1]] == ["02", "10"]
  end
  return res.flatten(1) # or whathever
end

Итак, он может обрабатывать также:

k = ["02", "10", "02", "10", "00", "42", "00", "00", "26"]
split_strange(k)
#=> [["02", "10", "02", "10", "00", "42", "00", "00", "26"], ["00", "42", "00", "00", "26"], ["02", "10", "00", "42", "00", "00", "26"], ["00", "00", "26"]]


Альтернатива, но работает с одним вхождением:
def split_strange_2(ary)
  tmp = ary.slice_when { |a, b|  a == "02" and b == "10" }.to_a
  res = tmp.last.unshift tmp.first.last
  return res, res[4..-1] || [] if tmp.size == 2
end

split_strange_2(a)
#=> [["02", "10", "00", "42", "00", "00", "26"], ["00", "00", "26"]]
0 голосов
/ 03 февраля 2019
def find_em(a)
  i = (a.size-1).times.find { |i| [a[i], a[i+1]] == ["02", "10"] }
  i.nil? ? nil : [a[i..-1], a[i+4..-1] || []]
end

find_em(a)
  #=> [["02", "10", "00", "42", "00", "00", "26"], ["00", "00", "26"]] 

find_em ["10", "4C", "02", "10", "00", "42"]
  #=> [["02", "10", "00", "42"], []] 

find_em ["10", "4C", "02", "10"]
  #=> [["02", "10"], []] 

find_em ["10", "4C", "10", "00", "42"]
  #=> nil 

find_em []
  #=> nil 
...