Um Set a é uma sequência de valores únicos do tipo a.
Os valores precisam ser do tipo comparable (Int, Float, Time, Char, String, e tuplas ou listas de tipos comparáveis).
Você pode transformar listas e conjuntos entre si com Set.toList e Set.fromList.
Por causa da estrutura interna do Set, é garantido que uma lista obtida de Set.fromList estará ordenada.
Set.fromList [2, 3, 3, 3, 1, 1, 2]
--> Set.fromList [1, 2, 3]
Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
--> [1, 2, 3]
Você pode criar e preencher conjuntos com Set.empty, Set.singleton, Set.insert e Set.remove.
Set.empty
--> Set.fromList []
Set.singleton "hi"
--> Set.fromList ["hi"]
eightyEight = Set.singleton 88
Set.insert 88 eightyEight
--> Set.fromList [88]
Set.insert 89 eightyEight
--> Set.fromList [88, 89]
Set.remove 88 eightyEight
--> Set.fromList []
Set.remove 89 eightyEight
--> Set.fromList [88]
Você pode consultar o conteúdo de um conjunto com as funções Set.member, Set.isEmpty e Set.size.
Set.member 88 eightyEight
--> True
Set.isEmpty eightyEight
--> False
Set.size eightyEight
--> 1
Conjuntos podem ser combinados com Set.union, Set.intersect e Set.diff.
a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Set.union a b
--> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]
Set.intersect a b
--> Set.fromList [1, 10]
Set.diff a b
--> Set.fromList [100]
Set.diff b a
--> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]
Você pode filtrar e particionar conjuntos.
even n = modBy 2 n == 0
Set.filter even b
--> Set.fromList [2, 4, 6, 8, 10]
Set.partition even b
--> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])
A sua nostalgia por cartas Blorkemon™️ não dá sinais de diminuir, você até voltou a colecioná-las e está chamando os seus amigos para participar.
Neste exercício, uma coleção de Card é representada por Set Card, já que cartas duplicadas não importam quando o seu objetivo é conseguir todas as cartas existentes.
Você quer muito que seus amigos entrem na sua loucura Blorkemon™️, e a melhor maneira é dar o pontapé inicial na coleção deles presenteando cada um com uma carta.
Implemente newCollection, que transforma uma carta em uma coleção.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
Depois que você tem uma coleção, ela ganha vida própria e precisa crescer.
Implemente addCard, que recebe um Card e uma coleção, e retorna uma Tuple com dois valores: um Bool que indica se o Card já estava na coleção, e a coleção com a carta adicionada.
addCard "Scientuna" (Set.fromList ["Newthree"])
--> (False, Set.fromList ["Newthree", "Scientuna"])
Agora que seus amigos estão loucos por Blorkemon™️ de novo, você pode usar isso para aumentar a sua própria coleção trocando cartas.
Nem toda troca vale a pena, ou pode sequer ser feita. Você não pode trocar uma carta que não tem, e não deve trocar uma carta por outra que você já tem.
Implemente tradeCard, que recebe duas cartas a serem trocadas (a sua e a deles) e a sua coleção atual.
O valor de retorno é uma Tuple de dois valores: um Bool que diz se a troca é possível e vale a pena, e a coleção com que você ficaria se fizesse a troca (mesmo que ela não seja realmente possível).
tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
--> (True, Set.fromList ["Newthree"])
Você encontra um velho estoque de cartas em um mercado de pulgas. Você precisa ordenar as cartas e remover as duplicadas para comparar a lista com a sua coleção.
Implemente removeDuplicates, que ordena uma lista de cartas e retorna uma lista de cartas ordenadas e sem repetições.
removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
--> ["Newthree", "Scientuna"]
É hora de se sentir bem com a sua coleção.
Implemente extraCards, que recebe a sua coleção e outra coleção qualquer, e retorna o número de cartas que a outra coleção não tem.
extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
--> 0
Você e seus amigos entusiastas de Blorkemon™️ se reúnem e se perguntam quais cartas são as mais comuns.
Implemente boringCards, que recebe uma lista de coleções e retorna uma lista de cartas ordenadas que todas as coleções têm.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
Você e seus amigos, juntos, possuem todas as cartas Blorkemon™️?
Implemente totalCards, que recebe uma lista de coleções e retorna o número total de cartas diferentes em todas as coleções.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
Seu sobrinho vai te visitar em breve, e você está a fim de impressioná-lo. Crianças gostam de coisas brilhantes, né? As cartas Blorkemon™️ podem ser brilhantes!
Implemente splitShinyCards, que recebe uma coleção e retorna uma Tuple com duas listas de cartas ordenadas: uma com todas as cartas que começam com "Shiny" e outra com as demais cartas.
splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
--> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.