Un conjunto es una colección inmutable y no ordenada de valores únicos. Todos los elementos de un conjunto deben ser del mismo tipo.
El módulo gleam/set define el tipo Set y proporciona funciones para trabajar con conjuntos.
Puedes transformar listas y conjuntos entre sí con set.to_list y set.from_list. No se garantiza el orden de los elementos de un conjunto.
set.from_list([2, 3, 3, 3, 1, 1, 2])
// -> set.from_list([1, 2, 3])
set.to_list(set.from_list([2, 3, 3, 3, 1, 1, 2]))
// -> [1, 2, 3]
Puedes crear y llenar conjuntos con set.new, set.insert y set.delete.
set.new()
// -> set.from_list([])
let eighty_eight = set.from_list([88])
set.insert(eighty_eight, 88)
// -> set.from_list([88])
set.insert(eighty_eight, 89)
// -> set.from_list([88, 89])
set.delete(eighty_eight, 89)
// -> set.from_list([88])
Puedes consultar el contenido de un conjunto con las funciones set.contains y set.size.
set.contains(eighty_eight, 88)
// -> True
set.size(eighty_eight)
// -> 1
Los conjuntos se pueden combinar con set.union y set.intersection.
let a = set.from_list([1, 5, 10])
let b = set.from_list([1, 2, 3, 4, 5])
set.union(a, b)
// -> set.from_list([1, 2, 3, 4, 5, 10])
set.intersection(a, b)
// -> set.from_list([1, 5])
También puedes filtrar conjuntos.
let is_small = fn(n) { n <= 3 }
set.filter(b, is_small)
// -> set.from_list([1, 2, 3])
Tu nostalgia por las cartas Blorkemon™️ no muestra 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 cartas se representa con Set(String), ya que las cartas duplicadas no importan 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 manera es darles el empujón inicial a su colección regalándoles una carta.
Implementa new_collection, que transforma una carta en una colección.
new_collection("Newthree")
// -> set.from_list(["Newthree"])
Una vez que tienes una colección, esta cobra vida propia y tiene que crecer.
Implementa add_card, que recibe una carta y una colección, y devuelve una tupla con dos valores: un Bool que indica si la carta ya estaba en la colección, y la colección con la carta agregada.
add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))
Ahora que tus amigos están otra vez locos por Blorkemon™️, puedes aprovechar esto para hacer crecer tu propia colección intercambiando cartas.
No todos los intercambios valen la pena, ni siquiera se pueden hacer siempre. No puedes intercambiar una carta que no tienes, y no deberías cambiar una carta por otra que ya tienes.
Implementa trade_card, que recibe dos cartas para intercambiar (la tuya y la suya) y tu colección actual.
El valor devuelto es una tupla con 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).
trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))
Tú y tus amigos aficionados a Blorkemon™️ se reúnen y se preguntan cuáles son las cartas más comunes.
Implementa boring_cards, que recibe una lista de colecciones y devuelve una lista ordenada de las cartas que tienen todas las colecciones.
boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]
¿Entre tú y tus amigos tienen todas las cartas de Blorkemon™️?
Implementa total_cards, que recibe una lista de colecciones y devuelve el número total de cartas distintas en todas las colecciones.
total_cards([set.from_list(["Scientuna"]), set.from_list(["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 shiny_cards, que recibe una colección y devuelve un conjunto que contiene todas las cartas que empiezan con "Shiny ".
shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])
Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.