Как сравнить 1 число со всем массивом? - PullRequest
0 голосов
/ 15 апреля 2020

Создайте функцию, которая принимает массив высот препятствий и высоту прыжка прыгуна и определяет, может ли препятствие преодолеть все препятствия. Препятствующий может преодолеть препятствие, если высота его прыжка больше или равна высоте препятствия.

Мой код:

def hj (arr, h)

  i = 0


  while i < arr.length

    j = 0


    while j < arr.length  

      if arr[i] > h
      return false
      end  
      j += 1

    end


    return true

    i += 1

  end

end

puts hj([2, 3, 6, 1, 3, 1, 8], 7)
  • Желаемый результат: истина, если h>> для любого числа в массиве; false, если h <любое число в массиве (я хочу, чтобы true или false отображались один раз) </p>

  • Где я задаю свой собственный код:

    1. Не уверен, что если мне нужны два оператора while
    2. , текущий передаваемый массив должен вывести false
    3. l oop, кажется, сравнивает только первый набор чисел, поэтому 7 и 2. Не уверен почему l oop останавливается.
    4. Не уверен, правильно ли я использую true и false
    5. Чувствую, что я должен использовать блок для этого, но не уверен, где его реализовать .

Заранее благодарен за любые отзывы.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Некоторые решения:

Использование l oop

def hj(arr, h)
  for elem in arr
    return false if elem > h
  end
  true
end

Видите? Только один л oop. На самом деле это самая нестандартная ruby реализация.

Использование Enumerable # all?

def hj(arr, h)
  arr.all?{|elem| elem <= h}
end

Это наиболее интуитивная и наиболее Ruby реализация.

Использование Enumerable # max

Если можно перепрыгнуть через самое высокое препятствие, он может перепрыгнуть через все препятствия.

def hj(arr, h)
  arr.max <= h
end
0 голосов
/ 15 апреля 2020
  1. Не уверен, что мне нужно два выражения while

Нет. Вам нужно только пройти список один раз. Вы пересекаете, а не сортируете / переупорядочиваете.

l oop, кажется, сравнивает только первый набор чисел, поэтому 7 и 2. Не уверен, почему останавливается l oop.

Это потому, что вы return true используется как второе последнее утверждение вашего внешнего l oop. Return прерывает выполнение функции и немедленно возвращает вызывающую функцию - в данном случае последнюю строку вашей программы.

Чувствую, что я должен использовать блок для этого, но не уверен, где его реализовать.

Блок - идиоматический c ruby способ решить эту проблему. По сути, вы хотите проверить, что ваш второй параметр больше, чем любое значение в списке, которое является вашим первым параметром.

Решение в idiomati c ruby будет

def hj (arr, h)
    # return true if h >= all elements in arr, false otherwise

    # given arr = [1, 2, 3] and h = 2, 
    # returns [ true, true, false ] which all? then returns as false 
    # (since all? returns the boolean AND of the results of the block evaluation

    arr.all? { |elem| elem <= h }  
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...