Subconjunto e Superconjunto
Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 21 de 56.
Além de combinar conjuntos, você também pode compará-los.
isSubset(of:) responde "cada um dos meus elementos também está no outro conjunto?"
let small: Set = [1, 2]
let big: Set = [1, 2, 3, 4]
small.isSubset(of: big) // true
big.isSubset(of: small) // falseisSuperset(of:) é o inverso, "eu contenho todos os elementos do outro conjunto?":
big.isSuperset(of: small) // trueisDisjoint(with:) retorna true quando os dois conjuntos não compartilham nenhum elemento:
let evens: Set = [2, 4, 6]
let odds: Set = [1, 3, 5]
evens.isDisjoint(with: odds) // trueEstes três predicados são a maneira mais limpa de expressar "permissões obrigatórias" ou regras "all-of" / "none-of" sem escrever um loop manual.
Desafio
MédioVocê está verificando o acesso a um documento. Leia três linhas:
- As permissões do usuário (separadas por vírgula)
- As permissões obrigatórias (separadas por vírgula)
- As permissões proibidas (separadas por vírgula)
O acesso é concedido ao usuário quando:
- Suas permissões são um superset das obrigatórias (cada permissão obrigatória é possuída)
- Suas permissões são disjoint das proibidas
Imprima exatamente um dos seguintes:
grantedmissing: <...>quando permissões obrigatórias estiverem faltando (ordenadas, separadas por vírgula). Imprima isso mesmo que permissões proibidas também sejam possuídas.forbidden: <...>quando nenhuma permissão obrigatória estiver faltando, mas permissões proibidas forem possuídas (ordenadas, separadas por vírgula)
Para a entrada read,write,admin / read,write / delete, a saída é granted.
Para a entrada read / read,write / delete, a saída é missing: write.
Folha de consulta
Métodos de comparação de conjuntos (Set) em Swift:
let small: Set = [1, 2]
let big: Set = [1, 2, 3, 4]
small.isSubset(of: big) // true – cada elemento de small está em big
big.isSuperset(of: small) // true – big contém cada elemento de small
let evens: Set = [2, 4, 6]
let odds: Set = [1, 3, 5]
evens.isDisjoint(with: odds) // true – nenhum elemento compartilhadoExperimente você mesmo
let user = Set(readLine()!.components(separatedBy: ","))
let required = Set(readLine()!.components(separatedBy: ","))
let forbidden = Set(readLine()!.components(separatedBy: ","))
// TODO: concedido | faltando: ... | proibido: ...
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras