Un Set a es una secuencia de valores únicos de tipo a.
Los valores tienen que ser de tipo comparable (Int, Float, Time, Char, String, y tuplas o listas de tipos comparables).
Puedes transformar listas y conjuntos entre sí con Set.toList y Set.fromList.
Debido a la estructura interna de Set, está garantizado que una lista obtenida 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]
Puedes crear y poblar conjuntos con Set.empty, Set.singleton, Set.insert y 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]
Puedes consultar el contenido de un conjunto con las funciones Set.member, Set.isEmpty y Set.size.
Set.member 88 eightyEight
--> True
Set.isEmpty eightyEight
--> False
Set.size eightyEight
--> 1
Los conjuntos se pueden combinar con Set.union, Set.intersect y 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]
Puedes filtrar y dividir 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])
Tu nostalgia por las cartas Blorkemon™️ no muestra signos de frenarse, incluso has vuelto a coleccionarlas y estás consiguiendo que tus amigos se unan a ti.
En este ejercicio, una colección de Card se representa mediante Set Card, ya que las cartas duplicadas no son importantes cuando tu objetivo es conseguir todas las cartas existentes.
Tienes muchas ganas de que tus amigos se unan a tu locura por Blorkemon™️, y la mejor forma es poner en marcha su colección regalándoles una carta.
Implementa newCollection, que transforma una carta en una colección.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
Una vez que tienes una colección, cobra vida propia y debe crecer.
Implementa addCard, que recibe una Card y una colección, y devuelve una Tuple con dos valores: un Bool que indica si la Card ya estaba en la colección, y la colección con la carta añadida.
addCard "Scientuna" (Set.fromList ["Newthree"])
--> (False, Set.fromList ["Newthree", "Scientuna"])
Ahora que tus amigos vuelven a estar locos por Blorkemon™️, puedes aprovechar esto para hacer crecer tu propia colección intercambiando cartas.
No todos los intercambios merecen la pena, ni siquiera pueden hacerse. No puedes intercambiar una carta que no tienes, y no deberías intercambiar una carta por otra que ya tienes.
Implementa tradeCard, que recibe dos cartas para intercambiar (la tuya y la suya) y tu colección actual.
El valor devuelto es una Tuple de dos valores: un Bool que indica si el intercambio es posible y merece la pena, y la colección con la que terminarías si hicieras el intercambio (aunque en realidad no sea posible).
tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
--> (True, Set.fromList ["Newthree"])
Encuentras un alijo antiguo de cartas en un mercadillo. Debes ordenar las cartas y eliminar los duplicados para comparar la lista con tu colección.
Implementa removeDuplicates, que ordenará una lista de cartas y devolverá una lista de cartas ordenadas y únicas.
removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
--> ["Newthree", "Scientuna"]
Es hora de sentirte bien con tu colección.
Implementa extraCards, que recibe tu colección y otra colección, y devuelve el número de cartas que la otra colección no tiene.
extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
--> 0
Tú y tus amigos aficionados a Blorkemon™️ os reunís y os preguntáis qué cartas son las más comunes.
Implementa boringCards, que recibe una lista de colecciones y devuelve una lista de cartas ordenadas que tienen todas las colecciones.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
¿Tenéis tú y tus amigos, entre todos, todas las cartas Blorkemon™️?
Implementa totalCards, que recibe una lista de colecciones y devuelve el número total de cartas diferentes que hay en todas las colecciones.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
Tu sobrino viene pronto a visitarte y te apetece impresionarlo. A los niños les gustan las cosas brillantes, ¿verdad? ¡Las cartas Blorkemon™️ pueden ser brillantes!
Implementa splitShinyCards, que recibe una colección y devuelve una Tuple con dos listas de cartas ordenadas: una con todas las cartas que empiezan por "Shiny" y otra con las demás cartas.
splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
--> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.