Массив # product - метод выбора здесь.
Сначала создайте следующий массив.
arr = [['1'], [*'05'..'15'], ['78'], [*'02'..'04', *'07'..'12', *'15'..'27'],
[*'00000'..'99999']]
#=> [["1"], ["05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15"],
# ["78"], ["02", "03", "04", "07", "08", "09", "10", "11", "12", "15",
# "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27"],
# "00000", "00001",..., "99999"]
Размеры каждого элемента (массива) arr
следующие.
arr.map(&:size)
#=> [1, 11, 1, 22, 100000]
Чтобы сгенерировать все комбинации массивов, полученные путем выбора одного элемента из каждого элемента (массива) arr
и затем преобразования результирующего массива в строку, мы записываем следующее (выполнение которого занимает некоторое время):
combos = arr.first.product(*arr.drop(1)).map(&:join)
n = combos.size
#=> 24200000
combos.first(2)
#=> ["105780200000", "105780200001"]
combos.last(2)
#=> ["115782799998", "115782799999"]
5.times do
i = rand(n)
puts "%5d -> %s" % [i, combos[i]]
end
9379583 -> 109780979583
12310295 -> 110781910295
11619403 -> 110781019403
3571703 -> 106781971703
18237011 -> 113781037011
Примечание:
size.reduce(:*)
#=> 24200000