Un MapSet è una collezione di valori unici, che rappresenta gli insiemi in Elixir.
Può contenere valori di qualsiasi tipo, senza una nozione di ordine.
Tieni presente che esiste anche il modulo Set, ma è deprecato a favore di MapSet.
Puoi creare insiemi usando MapSet.new/0, MapSet.new/1 e MapSet.new/2, e trasformarli in liste usando MapSet.to_list/1.
MapSet.new()
# => MapSet.new([])
MapSet.new([2, 3, 3, 3, 1, 1, 2, "hello"])
# => MapSet.new([1, 2, 3, "hello"])
MapSet.new([2, 3, 3, 3, 1, 1, 2], fn n -> 10 * n end)
# => MapSet.new([10, 20, 30])
[2, 3, 3, 3, 1, 1, 2] |> MapSet.new() |> MapSet.to_list()
# => [1, 2, 3]
Tieni presente che, poiché i MapSet non hanno una nozione di ordine, non è garantito che MapSet.to_list/1 restituisca una lista ordinata.
Puoi aggiungere o rimuovere elementi con MapSet.put/2 e MapSet.delete/2.
Puoi interrogare il contenuto di un insieme con le funzioni MapSet.size/1, MapSet.member?/2, e confrontare insiemi con MapSet.equal?/2, MapSet.subset?/2 e MapSet.disjoint?/2.
a = MapSet.new([1, 10])
b = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
MapSet.size(b)
# => 10
MapSet.member?(a, 10)
# => true
MapSet.subset?(a, b)
# => true
MapSet.disjoint?(a, b)
# => false
I MapSet possono essere combinati con MapSet.union/2, MapSet.intersection/2, MapSet.difference/2 e MapSet.symmetric_difference/2.
a = MapSet.new([1, 10, 100])
b = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
MapSet.union(a, b)
# => MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100])
MapSet.intersection(a, b)
# => MapSet.new([1, 10])
MapSet.difference(a, b)
# => MapSet.new([100])
MapSet.difference(b, a)
# => MapSet.new([2, 3, 4, 5, 6, 7, 8, 9])
MapSet.symmetric_difference(b, a)
# => MapSet.new([2, 3, 4, 5, 6, 7, 8, 9, 100])
Puoi filtrare e partizionare insiemi con MapSet.filter/2, MapSet.reject/2 e MapSet.split_with/2.
a = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
even = fn n -> rem(n, 2) == 0 end
MapSet.filter(a, even)
# => MapSet.new([2, 4, 6, 8, 10])
MapSet.reject(a, even)
# => MapSet.new([1, 3, 5, 7, 9])
MapSet.split_with(a, even)
# => {MapSet.new([2, 4, 6, 8, 10]), MapSet.new([1, 3, 5, 7, 9])}
La tua nostalgia per le carte Blorkemon™️ non accenna a diminuire, hai perfino ricominciato a collezionarle e stai convincendo i tuoi amici a unirsi a te.
In questo esercizio, una collezione di carte è rappresentata da un MapSet, dato che le carte duplicate non contano quando l'obiettivo è ottenere tutte le carte esistenti.
Vuoi davvero che i tuoi amici entrino nella tua follia per i Blorkemon™️, e il modo migliore è dare il via alla loro collezione regalando loro una carta.
Implementa GottaSnatchEmAll.new_collection, che trasforma una carta in una collezione.
GottaSnatchEmAll.new_collection("Newthree")
# => MapSet.new(["Newthree"])
Una volta che hai una collezione, questa prende vita propria e deve crescere.
Implementa GottaSnatchEmAll.add_card, che prende una carta e una collezione e restituisce una tupla con due valori: un booleano che indica se la carta era già nella collezione, e la collezione con la carta aggiunta.
GottaSnatchEmAll.add_card("Scientuna", MapSet.new(["Newthree"]))
# => {false, MapSet.new(["Newthree", "Scientuna"])}
Ora che i tuoi amici sono di nuovo pazzi per i Blorkemon™️, puoi approfittarne per far crescere la tua collezione scambiando carte.
Non tutti gli scambi valgono la pena, né sono sempre possibili. Non puoi scambiare una carta che non hai, e non dovresti scambiare una carta con una che possiedi già.
Implementa GottaSnatchEmAll.trade_card, che prende due carte da scambiare (la tua e la loro) e la tua collezione attuale.
Il valore restituito è una tupla di due valori: un booleano che indica se lo scambio è possibile e vale la pena, e la collezione che ti ritroveresti facendolo (anche se in realtà non è possibile).
GottaSnatchEmAll.trade_card("Scientuna", "Newthree", MapSet.new(["Scientuna"]))
# => {true, MapSet.new(["Newthree"])}
Trovi una vecchia scorta di carte a un mercatino delle pulci. Devi ordinare le carte ed eliminare i duplicati per confrontare la lista con la tua collezione.
Implementa GottaSnatchEmAll.remove_duplicates, che ordina una lista di carte e restituisce una lista di carte uniche e ordinate.
GottaSnatchEmAll.remove_duplicates(["Newthree", "Newthree", "Newthree", "Scientuna"])
# => ["Newthree", "Scientuna"]
È il momento di essere soddisfatto della tua collezione.
Implementa GottaSnatchEmAll.extra_cards, che prende la tua collezione ed un'altra collezione e restituisce il numero di carte che l'altra collezione non ha.
GottaSnatchEmAll.extra_cards(MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"]))
# => 0
Tu ed i tuoi amici appassionati di Blorkemon™️ vi riunite e vi chiedete quali carte siano le più comuni.
Implementa GottaSnatchEmAll.boring_cards, che prende una lista di collezioni e restituisce una lista ordinata delle carte che tutte le collezioni hanno.
GottaSnatchEmAll.boring_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => ["Scientuna"]
Tu ed i tuoi amici possedete collettivamente tutte le carte Blorkemon™️?
Implementa GottaSnatchEmAll.total_cards, che prende una lista di collezioni e restituisce il numero totale di carte diverse presenti in tutte le collezioni.
GottaSnatchEmAll.total_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => 2
Tuo nipote verrà presto a trovarti e ti va di fargli una bella impressione. Ai bambini piacciono le cose luccicanti, no? Le carte Blorkemon™️ possono essere luccicanti!
Implementa GottaSnatchEmAll.split_shiny_cards, che prende una collezione e restituisce una tupla con due liste di carte ordinate: una con tutte le carte che iniziano con "Shiny" ed una con le altre carte.
GottaSnatchEmAll.split_shiny_cards(MapSet.new(["Newthree", "Scientuna", "Shiny Scientuna"]))
# => {["Shiny Scientuna"], ["Newthree", "Scientuna"]}
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.