Ruby: Как преобразовать строковое (ARGV) представление целых чисел и диапазонов в массив целых чисел - PullRequest
3 голосов
/ 22 октября 2010

В Ruby, как я могу взять массив токенов, представляющих целые числа или диапазоны, и разобрать их в массив целых чисел, который включает каждое целое число и каждый элемент в каждом диапазоне?

Пример: заданный ввод [ "5", "7-10", "24", "29-31"]

Я бы хотел произвести вывод [ 5, 7, 8, 9, 10, 24, 29, 30, 31 ]

Спасибо.

Ответы [ 4 ]

3 голосов
/ 22 октября 2010
[ "5", "7-10", "24", "29-31"].map{|x| x.split("-").map{|val| val.to_i}}.map{ |y| Range.new(y.first, y.last).to_a}.flatten
1 голос
/ 22 октября 2010

Ну, это может потребовать немного работы, на самом деле. Я сейчас попробую:

def parse_argv_list(list)
   number_list = []
   list.each do |item|
      if item.include?('-')
         bounds = item.split('-')
         number_list.push((bounds[0].to_i..bounds[1].to_i).to_a)
      else
         number_list.push(item.to_i)
      end
   end
   number_list.flatten
end
1 голос
/ 22 октября 2010

Что-то вроде следующего должно работать. Просто передайте свой вход в метод и получите массив целых чисел. Я держал это намеренно многословно, чтобы вы могли видеть логику.

Редактировать : я добавил комментарии к коду.

def generate_output(input)
    output = []
    input.each do |element|
        if element.include?("-")
            # If the number is a range, split it
            split = element.split("-")
            # Take our split and turn it into a Ruby Range object, then an array
            output << (split[0].to_i..split[1].to_i).to_a
        else
            # If it's not a range, just add it to our output array
            output << element.to_i
        end
    end
    # Since our ranges will add arrays within the output array, calling flatten
    # on it will make it one large array with all the values in it.
    return output.flatten
end

Выполнение этого кода на вашем примере ввода приводит к вашему примеру, поэтому я считаю, что это точно.

0 голосов
/ 22 октября 2010
>> [ "5", "7-10", "24", "29-31"].map{|x|x.gsub!(/-/,"..");x[".."]?(eval x).to_a : x.to_i}.flatten
=> [5, 7, 8, 9, 10, 24, 29, 30, 31]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...