Как найти кратные 3 и 5, нажать на массив, а затем сложить массив - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь сложить кратные 3 и 5, которые меньше 1000, используя each, а затем push, чтобы сохранить их все в массиве multiples. Я пытаюсь научиться использовать эти команды, и поэтому я не хочу использовать select и inject.

У меня есть контроллеры, настроенные для печати @your_output на другой странице, и я успешно справился с более простыми проблемами. Я попытался сделать условное и сохранить его в div:

def third_program
  numbers = (1..999).to_a
  multiples = []
  numbers.each do |num|
    div = num % 3 == 0 || num % 5 == 0
    multiples.push(div)
  end
  @your_output = div.sum
  render("programs_templates/third_program.html.erb")
end

С этим кодом я получаю ошибку.

Вот решение, которое сработало для меня:

def third_program
    numbers = (1..999).to_a

    # Your code goes below.
    multiples = []

    numbers.each do |num|

      if num % 3 == 0 || num % 5 == 0
          multiples.push(num)
      end
      end
    @your_output = multiples.sum

    render("programs_templates/third_program.html.erb")
  end

Ответы [ 3 ]

0 голосов
/ 23 января 2019

У вас есть пара проблем. Сначала вы пытаетесь получить доступ к div за пределами блока each. Если вы действительно хотите это сделать, чего не хотите, потому что вы должны вызывать sum на multiples, а не div, вам нужно определить его на уровне области действия метода, а затем разрешить блок each изменить его.

Во-вторых, вы должны нажать num, а не div на multiples.

В-третьих, вам нужно проверить, является ли div истиной, прежде чем вы отправите массив.

Я не проверил всю вашу логику, поэтому могут быть и другие ошибки.

   def third_program
        numbers = (1..999).to_a

        # Your code goes below.
        multiples = []
        numbers.each do |num|
          div = num % 3 == 0 || num % 5 == 0
            multiples.push(num) if div 
        end
        @your_output = multiples.sum

        puts @your_output
    end
    third_program
    # => 233168
0 голосов
/ 23 января 2019

Вам нужно добавить num к multiples, если num делится на 5 и 3, а не div.Это потому, что div = num % 3 == 0 || num % 5 == 0 это просто true или false, добавление div заканчивается массивом логических значений ([false, true, true, ...]).

@your_output = div.sum находится вне цикла, а div там не существует, это выходит за рамки.

Даже если в области, вы все равно вызываете @your_output = true.sum (или false.sum), получая ошибку: NoMethodError.

Переменная divна самом деле не требуется, используйте только его состояние.Также нет необходимости конвертировать Range в Array.Итак, я бы предложил этот рефакторинг:

def third_program
  multiples = []
  (1..999).each do |num|
    multiples << num if num % 3 == 0 || num % 5 == 0
  end
  @your_output = multiples.sum

  # render("programs_templates/third_program.html.erb")
end

p third_program #=> 233168

Это можно еще сократить:

@your_output = (1..999).select{ |n| n % 3 == 0 || n % 5 == 0 }.sum #=> 233168
0 голосов
/ 23 января 2019

Более простой способ сделать это был бы следующим:

multiples.push(div) if num % 3 == 0 or num % 5 == 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...