Пересмотр метода Ruby для представления целочисленного разбиения в виде упорядоченной строки (без выравнивания?) - PullRequest
1 голос
/ 13 июня 2019

Я пишу, чтобы помочь улучшить метод Ruby, приведенный ниже, чтобы преобразовать целочисленный раздел, представленный в виде массива из n целых чисел (11 = [5,1,5]), где порядок разделов имеет значение, в строку, состоящую изиз 1 и 0, где 1 представляют единицы (или отметки), а 0 представляют арифметические разделители (+).Последняя возвращаемая строка не предназначена для чтения в виде числа в любой позиционной базовой системе, хотя это может быть.

Например, я хочу преобразовать целое число 11, представленное массивом 11 = [5,1, 5] - «1111101011111», который представляет, 11 = (11111) (+) (1) (+) (11111) или 11. Поскольку порядок имеет значение, 11 = [5,5,1] представляет другой раздел, а именно: «1111101111101" .

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

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

Вот что я пробовал.Буду признателен за помощь в улучшении этого кода.В частности, я надеюсь получить отзывы о том, как я выравниваю окончательный массив и, возможно, узнаю, как можно избежать использования объединений и построения строки напрямую, не прибегая к временному массиву.

def partition_to_string(n)
  representation = []
  n.each_with_index do |partition,index|
    if index == n.size - 1 then
      representation << [Array.new(partition,"1")]
    else 
      representation << [Array.new(partition,"1"),"0"]
    end
  end
  return representation.flatten.join
end

puts partition_to_string([11])
#=> "11111111111"
puts partition_to_string([5,1,5])
#=> "1111101011111"
puts partition_to_string([5,5,1])
#=> "1111101111101"

Длятривиальное разбиение числа на 1 часть, то есть строка, состоящая всего из 1 (например, 11 = [11]), строка не требует нулей, так как она состоит только из 1 части, поэтому я хочу представитьэто просто [11] = "111111111111" (11 1).Аналогично, в разделах из нескольких частей для окончательного слагаемого нет необходимости добавлять дополнительный 0 в самом конце.То есть метод должен возвращать для [5,1,5] = "1111101011111", а не для "11111010111110".Я думаю, что обработал эти случаи в приведенном выше коде, просматривая массив и проверяя текущий элемент с размером переданного исходного массива.

1 Ответ

4 голосов
/ 13 июня 2019

Вы можете просто использовать Array # map и Array # join :

ary.map { |n| "1" * n }.join("0")

То есть [5,1,5].map { |n| "1" * n }.join("0") #=> "1111101011111"

Учитывая, что ["1"].join("0") #=> "1"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...