Menu
Coddy logo textTech

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)            // false

isSuperset(of:) é o inverso, "eu contenho todos os elementos do outro conjunto?":

big.isSuperset(of: small)          // true

isDisjoint(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)       // true

Estes 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.

challenge icon

Desafio

Médio

Você está verificando o acesso a um documento. Leia três linhas:

  1. As permissões do usuário (separadas por vírgula)
  2. As permissões obrigatórias (separadas por vírgula)
  3. 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:

  • granted
  • missing: <...> 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 compartilhado

Experimente você mesmo

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

// TODO: concedido | faltando: ... | proibido: ...
quiz iconTeste seus conhecimentos

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