Menu
Coddy logo textTech

count, all?, any?, none?

Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 24 из 56.

Четыре небольших метода Enumerable, которые отвечают на вопросы о коллекции, не заставляя вас писать цикл.

count возвращает количество элементов, удовлетворяющих условию блока:

[1, 2, 3, 4, 5].count { |n| n.even? }   # 2
[1, 2, 3, 4, 5].count                    # 5  (без блока, общее количество)

all? возвращает true, если каждый элемент удовлетворяет условию в блоке:

[2, 4, 6].all? { |n| n.even? }    # true
[2, 4, 7].all? { |n| n.even? }    # false

any? возвращает true, если хотя бы один элемент удовлетворяет условию:

[1, 2, 3].any? { |n| n.even? }    # true
[1, 3, 5].any? { |n| n.even? }    # false

none? возвращает true, если ни один из элементов не удовлетворяет условию:

[1, 3, 5].none? { |n| n.even? }   # true

Методы работают по принципу короткого замыкания: any? останавливается на первом совпадении, all? останавливается на первой неудаче. Они эффективны.

challenge icon

Задание

Легко

Прочитайте список результатов тестов (целых чисел), разделенных запятыми. Класс считается успешно сдавшим (valid passing class), когда:

  • none? из оценок не являются отрицательными (незаписанный тест)
  • all? оценок не превышают 100
  • any? оценка равна ровно 100 (хотя бы один идеальный результат)
  • как минимум 3 оценки >= 70 (используйте count)

Выведите ровно одну строку:

  • Valid: <count> passing, когда выполняются все четыре условия (count — это количество оценок >= 70)
  • Invalid в противном случае

Для входных данных 72,80,100,65,90: 4 оценки >= 70, отрицательных нет, все <= 100, одна равна 100, поэтому результат будет Valid: 4 passing.

Для 72,80,90: 3 оценки выше порога, но нет идеального результата, поэтому Invalid.

Шпаргалка

Четыре метода Enumerable, которые отвечают на вопросы о коллекции:

count – возвращает количество элементов, удовлетворяющих условию в блоке (или общий размер, если блок не указан):

[1, 2, 3, 4, 5].count { |n| n.even? }  # 2
[1, 2, 3, 4, 5].count                   # 5

all? – возвращает true, если каждый элемент удовлетворяет условию в блоке:

[2, 4, 6].all? { |n| n.even? }  # true

any? – возвращает true, если хотя бы один элемент удовлетворяет условию в блоке:

[1, 2, 3].any? { |n| n.even? }  # true

none? – возвращает true, если ни один элемент не удовлетворяет условию в блоке:

[1, 3, 5].none? { |n| n.even? }  # true

Эти методы работают по принципу короткого замыкания: any? останавливается на первом совпадении, all? останавливается на первой неудаче.

Попробуйте сами

scores = gets.chomp.split(",").map(&:to_i)

# TODO: объедините all?, any?, none?, count, чтобы определить Valid или Invalid
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком