Um Set a é uma sequência de valores únicos do tipo a.
Os valores têm de ser do tipo comparable (Int, Float, Time, Char, String, e tuplos ou listas de tipos comparáveis).
Podes transformar listas em conjuntos e vice-versa com Set.toList e Set.fromList.
Devido à estrutura interna de Set, é garantido que uma lista obtida a partir de Set.fromList fica 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]
Podes 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]
Podes 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
Os 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]
Podes 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 tua nostalgia pelas cartas Blorkemon™️ não dá sinais de abrandar, chegaste a começar a colecioná-las outra vez e estás a convencer os teus amigos a juntar-se a ti.
Neste exercício, uma coleção de Card é representada por Set Card, uma vez que as cartas duplicadas não são importantes quando o teu objetivo é obter todas as cartas existentes.
Queres mesmo que os teus amigos se juntem à tua loucura Blorkemon™️, e a melhor forma é dar o pontapé de saída na coleção deles oferecendo-lhes uma carta.
Implementa newCollection, que transforma uma carta numa coleção.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
Assim que tens uma coleção, ela ganha vida própria e tem de crescer.
Implementa addCard, que recebe um Card e uma coleção, e devolve um 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 os teus amigos estão outra vez loucos por Blorkemon™️, podes usar isso para aumentar a tua própria coleção trocando cartas.
Nem todas as trocas valem a pena, nem sequer são possíveis. Não podes trocar uma carta que não tens, e não deves trocar uma carta por outra que já tens.
Implementa tradeCard, que recebe duas cartas a trocar (a tua e a deles) e a tua coleção atual.
O valor devolvido é um Tuple de dois valores: um Bool que indica se a troca é possível e vale a pena, e a coleção com que ficarias se fizesses a troca (mesmo que ela não seja realmente possível).
tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
--> (True, Set.fromList ["Newthree"])
Encontras uma velha reserva de cartas numa feira da ladra. Tens de ordenar as cartas e remover as duplicadas para comparar a lista com a tua coleção.
Implementa removeDuplicates, que ordena uma lista de cartas e devolve uma lista de cartas ordenadas e únicas.
removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
--> ["Newthree", "Scientuna"]
Está na hora de te sentires bem com a tua coleção.
Implementa extraCards, que recebe a tua coleção e outra coleção qualquer, e devolve o número de cartas que a outra coleção não tem.
extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
--> 0
Tu e os teus amigos entusiastas de Blorkemon™️ reúnem-se e perguntam-se quais são as cartas mais comuns.
Implementa boringCards, que recebe uma lista de coleções e devolve uma lista de cartas ordenadas que todas as coleções têm.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
Será que tu e os teus amigos, em conjunto, têm todas as cartas Blorkemon™️?
Implementa totalCards, que recebe uma lista de coleções e devolve o número total de cartas diferentes em todas as coleções.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
O teu sobrinho vem visitar-te em breve e apetece-te impressioná-lo. As crianças gostam de coisas brilhantes, não é? As cartas Blorkemon™️ podem ser brilhantes!
Implementa splitShinyCards, que recebe uma coleção e devolve um Tuple com duas listas de cartas ordenadas: uma com todas as cartas que começam por "Shiny" e outra com as restantes cartas.
splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
--> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.