Menu
Coddy logo textTech

Подмножество и надмножество

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

Помимо объединения множеств, вы также можете их сравнивать.

isSubset(of:) отвечает на вопрос: «является ли каждый из моих элементов также элементом другого множества?»

let small: Set = [1, 2]
let big:   Set = [1, 2, 3, 4]
small.isSubset(of: big)            // true
big.isSubset(of: small)            // false

isSuperset(of:) работает наоборот: «содержу ли я все элементы другого множества?»:

big.isSuperset(of: small)          // true

isDisjoint(with:) возвращает true, если два множества не имеют общих элементов:

let evens: Set = [2, 4, 6]
let odds:  Set = [1, 3, 5]
evens.isDisjoint(with: odds)       // true

Эти три предиката — самый чистый способ выразить «необходимые разрешения» или правила «все из» / «ни одного из» без написания цикла вручную.

challenge icon

Задание

Средне

Вы проверяете доступ к документу. Прочитайте три строки:

  1. Разрешения пользователя (через запятую)
  2. Необходимые разрешения (через запятую)
  3. Запрещенные разрешения (через запятую)

Пользователю предоставляется доступ, когда:

  • Его разрешения являются надмножеством необходимых (каждое необходимое разрешение имеется)
  • Его разрешения не пересекаются с запрещенными

Выведите ровно одно из следующего:

  • granted
  • missing: <...>, когда отсутствуют необходимые разрешения (отсортированные, через запятую). Выводите это, даже если также имеются запрещенные разрешения.
  • forbidden: <...>, когда все необходимые разрешения на месте, но имеются запрещенные (отсортированные, через запятую)

Для входных данных read,write,admin / read,write / delete результатом будет granted.

Для входных данных read / read,write / delete результатом будет missing: write.

Шпаргалка

Методы сравнения множеств в Swift:

let small: Set = [1, 2]
let big:   Set = [1, 2, 3, 4]

small.isSubset(of: big)      // true – каждый элемент small содержится в big
big.isSuperset(of: small)    // true – big содержит каждый элемент small

let evens: Set = [2, 4, 6]
let odds:  Set = [1, 3, 5]
evens.isDisjoint(with: odds) // true – нет общих элементов

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

let user = Set(readLine()!.components(separatedBy: ","))
let required = Set(readLine()!.components(separatedBy: ","))
let forbidden = Set(readLine()!.components(separatedBy: ","))

// TODO: разрешено | отсутствует: ... | запрещено: ...
quiz iconПроверьте себя

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

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