Подмножество и надмножество
Часть раздела Логика и управление потоком путешествия по 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) // falseisSuperset(of:) работает наоборот: «содержу ли я все элементы другого множества?»:
big.isSuperset(of: small) // trueisDisjoint(with:) возвращает true, если два множества не имеют общих элементов:
let evens: Set = [2, 4, 6]
let odds: Set = [1, 3, 5]
evens.isDisjoint(with: odds) // trueЭти три предиката — самый чистый способ выразить «необходимые разрешения» или правила «все из» / «ни одного из» без написания цикла вручную.
Задание
СреднеВы проверяете доступ к документу. Прочитайте три строки:
- Разрешения пользователя (через запятую)
- Необходимые разрешения (через запятую)
- Запрещенные разрешения (через запятую)
Пользователю предоставляется доступ, когда:
- Его разрешения являются надмножеством необходимых (каждое необходимое разрешение имеется)
- Его разрешения не пересекаются с запрещенными
Выведите ровно одно из следующего:
grantedmissing: <...>, когда отсутствуют необходимые разрешения (отсортированные, через запятую). Выводите это, даже если также имеются запрещенные разрешения.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: разрешено | отсутствует: ... | запрещено: ...
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря