Ruby: как преобразовать строковое (ARGV) представление целых чисел и диапазонов в массив целых чисел

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

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

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

Спасибо.


person jsinnott    schedule 22.10.2010    source источник


Ответы (4)


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

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
person Jacob Relkin    schedule 22.10.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

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

person Mike Trpcic    schedule 22.10.2010
comment
Я буквально писал идентичный ответ! +1 - person Jacob Relkin; 22.10.2010

person    schedule
comment
Краткий. Элегантный. Фантастический. Спасибо :) - person jsinnott; 22.10.2010

person    schedule
comment
Ницца! Но eval заставляет меня нервничать. Я использую это для анализа ARGV, поэтому я думаю, что пользователь может довольно легко внедрить вредоносный код. - person jsinnott; 22.10.2010
comment
Нет, это должно быть безопасно для использования, если вы санируете ARGV (например, проверяете все свои ARGV на наличие цифр) перед выполнением фактического выравнивания. Важно не то, что вы используете, а то, как вы это используете. - person ghostdog74; 22.10.2010