Комбинаторика Рубин - PullRequest
       2

Комбинаторика Рубин

0 голосов
/ 19 ноября 2018

Мне нужно составить список номеров. Правила:

  1. 12 чисел в строке;
  2. Первый номер всегда "1";
  3. Числа 2-3 это элементы из массива = [05..15];
  4. 4-5 всегда "78";
  5. 6-7 это элементы из массива = [02,03,04,07,08,09,10,11,12,15..27];
  6. 8-12 - все варианты пятизначных чисел;

Я написал этот код:

file = File.new('./file.txt', 'w')
one = 1

(5..15).to_a.each do |two_three|
  if two_three.to_s.length == 1
    two_three = "0#{two_three}"
  end

  four_five = 78

  arr1 = (2..27).to_a
  arr2 = [0,1,5,6,13,14]
  arr3 = arr1-arr2
  arr3.each do |six_seven|
    if six_seven.to_s.length == 1
      six_seven = "0#{six_seven}"
    else 
      six_seven = "#{six_seven}"
    end

    Array.new(100000) do |index|
      index = index + 1

      if index.to_s.length == 1
        eight_twelve = "0000#{index}"
      elsif index.to_s.length == 2
        eight_twelve = "000#{index}"
      elsif index.to_s.length == 3
        eight_twelve = "00#{index}"
      elsif index.to_s.length == 4
        eight_twelve = "0#{index}"
      end

      file.puts "#{one}#{two_three}#{four_five}#{six_seven}#{eight_twelve}"
    end
  end
end

Работает, но неправильно. Результаты И продолжает перескакивать на все результаты (возвращать только тринадцатизначное значение в строке 200000). Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 19 ноября 2018

Массив # 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...