Un Set a es una secuencia de valores únicos de tipo a.
Los valores tienen que ser del tipo comparable (Int, Float, Time, Char, String, y tuplas o listas de tipos comparables).
Puedes transformar listas y sets 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 llenar sets 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 set con las funciones Set.member, Set.isEmpty y Set.size.
Set.member 88 eightyEight
--> True
Set.isEmpty eightyEight
--> False
Set.size eightyEight
--> 1
Un Set se puede 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 particionar sets.
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 da señales de disminuir; incluso empezaste a coleccionarlas de nuevo y estás haciendo que tus amigos se unan a ti.
En este ejercicio, una colección de Card se representa con Set Card, ya que las cartas duplicadas no son importantes cuando tu meta es conseguir todas las cartas que existen.
De verdad quieres que tus amigos se sumen a tu locura por Blorkemon™️, y la mejor forma es darles una carta para arrancar su colección.
Implementa newCollection, que transforma una carta en una colección.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
Una vez que tienes una colección, esta cobra vida propia y tiene que 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 están otra vez locos por Blorkemon™️, puedes aprovechar para hacer crecer tu propia colección intercambiando cartas.
No todos los intercambios valen la pena, ni siquiera se pueden hacer. 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 de retorno es una Tuple de dos valores: un Bool que indica si el intercambio es posible y vale 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 viejo alijo de cartas en un mercado de pulgas. Debes ordenar las cartas y eliminar las duplicadas para comparar la lista con tu colección.
Implementa removeDuplicates, que ordenará una lista de cartas y devolverá una lista de cartas únicas y ordenadas.
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 la cantidad 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™️ se reúnen y se preguntan cuáles son las cartas más comunes.
Implementa boringCards, que recibe una lista de colecciones y devuelve una lista de cartas ordenadas que todas las colecciones tienen.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
¿Tú y tus amigos tienen en conjunto todas las cartas de Blorkemon™️?
Implementa totalCards, que recibe una lista de colecciones y devuelve el número total de cartas diferentes en todas las colecciones.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
Tu sobrino viene a visitarte pronto y tienes ganas de impresionarlo. A los niños les gustan las cosas brillantes, ¿verdad? ¡Las cartas de 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 con "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.