Запишите число в расширенной форме - Рубин НЕ распечатывает нули - PullRequest
0 голосов
/ 11 сентября 2018

Практиковал этот вопрос на Codewars:

Вам дадут номер, и вам нужно будет вернуть его в виде строки в расширенной форме.Например:

expanded_form(12); # Should return '10 + 2'
expanded_form(42); # Should return '40 + 2'
expanded_form(70304); # Should return '70000 + 300 + 4'

Мой код:

def expanded_form(num)
  arry = Array.new
  arry << num.digits.reverse.each_with_index {|val, idx| val * (10 ** idx)} 
  arry.reverse.join(" + ")
end

Я тестировал его на приведенных выше примерах, но вернулся "1 + 2", "4 + 2", "7 + 3 + 4",почему each_with_index не работает?

Отредактировано 15:03, 11 сентября 2018: Я исправил все вышеперечисленные ошибки, включая удаление нулей, и, как указал @iGianвне, метод .digits уже перевернуть все числа, что у меня сейчас:

def expanded_form(num)
  num.digits.each_with_index.map{| val, idx | val * (10 ** idx)}.select{|x| x != 0}.reverse.join(" + ")
end

Ура!

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вот еще одно решение

num.digits.each_with_index.with_object([]) do |(n,i),obj|
  obj.unshift("#{n}#{'0' * i}") if n > 0
end.join(" + ")

Поскольку цифры обратные, мы строим Array в обратном порядке, используя unshift.

Поскольку окончательное значение равно String, в любом случае мы используемString#* чтобы добавить необходимые нули, и мы вообще не добавляем нули в Array.

0 голосов
/ 11 сентября 2018

each_with_index ничего не преобразует, он просто повторяется, поэтому результат val * (10 ** idx) отбрасывается.

Вам нужно map this:

def expanded_form(num)
  num.digits.reverse.each_with_index.map do |val, idx|
    if (val > 0)
      val * (10 ** idx)
    end
  end.compact.reverse.join(' + ')
end

Когда map возвращает новый массив, вы можете пропустить всю часть Array.new и шаг вставки <<, который в любом случае не выполняет то, что вы ожидали.

...